From 50aabc8afca16903cd9c332fc5782732b4e0999b Mon Sep 17 00:00:00 2001 From: iPedroLB Date: Sat, 15 Jul 2023 01:45:29 -0300 Subject: [PATCH] Add the files --- Example/AddContactForm.Designer.cs | 123 + Example/AddContactForm.cs | 50 + Example/AddContactForm.resx | 120 + Example/ContactCardForm.Designer.cs | 240 + Example/ContactCardForm.cs | 109 + Example/ContactCardForm.resx | 123 + Example/ConversationForm.cs | 1077 ++ Example/ConversationForm.resx | 135 + Example/DotMSNClient.Designer.cs | 876 ++ Example/DotMSNClient.cs | 2343 ++++ Example/DotMSNClient.csproj | 257 + Example/DotMSNClient.csproj.user | 13 + Example/DotMSNClient.resx | 150 + Example/FileTransferForm.Designer.cs | 164 + Example/FileTransferForm.cs | 172 + Example/FileTransferForm.resx | 123 + Example/ImportContacts.Designer.cs | 120 + Example/ImportContacts.cs | 73 + Example/ImportContacts.resx | 123 + Example/MSNPSharp_logo.ico | Bin 0 -> 92854 bytes Example/MusicForm.Designer.cs | 142 + Example/MusicForm.cs | 44 + Example/MusicForm.resx | 120 + Example/Properties/AssemblyInfo.cs | 20 + Example/Properties/Resources.Designer.cs | 303 + Example/Properties/Resources.resx | 193 + Example/RemoveContactForm.Designer.cs | 102 + Example/RemoveContactForm.cs | 40 + Example/RemoveContactForm.resx | 120 + Example/Resources/Color_fontHS.png | Bin 0 -> 3205 bytes Example/Resources/MSNPSharp_logo.ico | Bin 0 -> 92854 bytes Example/Resources/MSNPSharp_logo_small.ico | Bin 0 -> 67646 bytes Example/Resources/YahooMessenger_logo.png | Bin 0 -> 16050 bytes Example/Resources/app_banner.png | Bin 0 -> 16675 bytes Example/Resources/file.png | Bin 0 -> 917 bytes Example/Resources/inner_emoicon.png | Bin 0 -> 7142 bytes Example/Resources/loading.gif | Bin 0 -> 3208 bytes Example/Resources/msn_ico.ico | Bin 0 -> 7278 bytes Example/Resources/nudge.png | Bin 0 -> 823 bytes Example/Resources/smileys/biggrin.gif | Bin 0 -> 230 bytes Example/Resources/smileys/sad.gif | Bin 0 -> 236 bytes Example/Resources/smileys/smiley.gif | Bin 0 -> 244 bytes Example/Resources/smileys/tongueout.gif | Bin 0 -> 248 bytes Example/Resources/smileys/wink.gif | Bin 0 -> 243 bytes Example/Resources/status/away.png | Bin 0 -> 152 bytes Example/Resources/status/busy.png | Bin 0 -> 152 bytes Example/Resources/status/circle.png | Bin 0 -> 190 bytes Example/Resources/status/closed.png | Bin 0 -> 179 bytes Example/Resources/status/hidden.png | Bin 0 -> 152 bytes Example/Resources/status/idle.png | Bin 0 -> 152 bytes Example/Resources/status/offline.png | Bin 0 -> 151 bytes Example/Resources/status/online.png | Bin 0 -> 152 bytes Example/Resources/status/open.png | Bin 0 -> 152 bytes Example/Resources/yahoo_ico.ico | Bin 0 -> 5710 bytes Example/ReverseAddedForm.Designer.cs | 151 + Example/ReverseAddedForm.cs | 51 + Example/ReverseAddedForm.resx | 120 + Example/RtfRichTextBox.cs | 427 + Example/TraceForm.Designer.cs | 165 + Example/TraceForm.cs | 291 + Example/TraceForm.resx | 169 + MSNPSharp.sln | 60 + MSNPSharp/Circle.Obsolete.cs | 45 + MSNPSharp/Circle.cs | 438 + MSNPSharp/CircleInviter.cs | 76 + MSNPSharp/CircleList.cs | 168 + MSNPSharp/ClassDiagram1.cd | 923 ++ MSNPSharp/Comparers.cs | 85 + MSNPSharp/Configuration.cs | 237 + MSNPSharp/ConnectivityException.cs | 83 + MSNPSharp/ConnectivitySettings.cs | 502 + MSNPSharp/Contact.cs | 1380 +++ MSNPSharp/ContactGroup.cs | 210 + MSNPSharp/ContactGroupList.cs | 131 + MSNPSharp/ContactList.cs | 545 + MSNPSharp/ContactManager.cs | 244 + MSNPSharp/Conversation.cs | 1179 ++ MSNPSharp/ConversationID.cs | 200 + MSNPSharp/Core/BitUtility.cs | 267 + MSNPSharp/Core/Converter.cs | 458 + MSNPSharp/Core/IMessageHandler.cs | 64 + MSNPSharp/Core/MSNMessage.cs | 254 + MSNPSharp/Core/MessagePool.cs | 78 + MSNPSharp/Core/MessageProcessor.cs | 69 + MSNPSharp/Core/MimeDictionary.cs | 236 + MSNPSharp/Core/MimeMessage.cs | 193 + MSNPSharp/Core/NSMessage.cs | 105 + MSNPSharp/Core/NSMessagePool.cs | 290 + MSNPSharp/Core/NSPayLoadMessage.cs | 134 + MSNPSharp/Core/NetworkMessage.cs | 148 + MSNPSharp/Core/NotificationMessage.cs | 528 + MSNPSharp/Core/PersistentStream.cs | 244 + MSNPSharp/Core/SBMessage.cs | 169 + MSNPSharp/Core/SBMessagePool.cs | 68 + MSNPSharp/Core/SocketMessageProcessor.cs | 576 + MSNPSharp/Core/TextPayloadMessage.cs | 111 + MSNPSharp/Credentials.cs | 229 + MSNPSharp/DataTransfer/MSNSLPHandler.cs | 1937 ++++ .../DataTransfer/MSNSLPInvitationEventArgs.cs | 226 + MSNPSharp/DataTransfer/MSNSLPMessage.cs | 589 + .../DataTransfer/MSNSLPTransferProperties.cs | 450 + MSNPSharp/DataTransfer/P2PDCPool.cs | 129 + MSNPSharp/DataTransfer/P2PDirectProcessor.cs | 493 + MSNPSharp/DataTransfer/P2PHandler.cs | 775 ++ MSNPSharp/DataTransfer/P2PHeader.cs | 963 ++ MSNPSharp/DataTransfer/P2PMessage.cs | 817 ++ MSNPSharp/DataTransfer/P2PMessagePool.cs | 212 + .../DataTransfer/P2PMessageSession.DC.cs | 423 + MSNPSharp/DataTransfer/P2PMessageSession.cs | 896 ++ MSNPSharp/DataTransfer/P2PTransferSession.cs | 1263 +++ MSNPSharp/DisplayImage.cs | 185 + MSNPSharp/Emoticon.cs | 81 + MSNPSharp/EmoticonMessage.cs | 159 + MSNPSharp/EndPointData.cs | 257 + MSNPSharp/EventArgs.cs | 1001 ++ MSNPSharp/Framework.cs | 358 + MSNPSharp/IO/DeltasList.cs | 416 + MSNPSharp/IO/IO.cs | 605 ++ MSNPSharp/IO/MCLSerializer.cs | 251 + MSNPSharp/IO/SerializableClasses.cs | 448 + MSNPSharp/IO/SerializableDictionary.cs | 200 + MSNPSharp/IO/SerializableMemoryStream.cs | 103 + MSNPSharp/IO/XMLContactList.cs | 2733 +++++ MSNPSharp/MSNObject.cs | 783 ++ MSNPSharp/MSNPSharp.csproj | 496 + MSNPSharp/MSNPSharp.csproj.user | 13 + MSNPSharp/MSNPSharpException.cs | 84 + MSNPSharp/MailEventArgs.cs | 439 + MSNPSharp/MessageManager.cs | 793 ++ MSNPSharp/MessageManagerEventArgs.cs | 120 + MSNPSharp/Messenger.cs | 501 + MSNPSharp/MobileMessage.cs | 197 + MSNPSharp/NSMessageHandler.Obsolete.cs | 70 + MSNPSharp/NSMessageHandler.cs | 3872 +++++++ MSNPSharp/NSMessageProcessor.cs | 146 + MSNPSharp/Owner.cs | 910 ++ MSNPSharp/PersonalMessage.cs | 291 + MSNPSharp/Properties/AssemblyInfo.cs | 26 + MSNPSharp/Properties/Resources.Designer.cs | 128 + MSNPSharp/Properties/Resources.resx | 142 + MSNPSharp/ProxySocket/AuthMethod.cs | 113 + MSNPSharp/ProxySocket/AuthNone.cs | 60 + MSNPSharp/ProxySocket/AuthUserPass.cs | 157 + MSNPSharp/ProxySocket/IAsyncProxyResult.cs | 96 + MSNPSharp/ProxySocket/ProxyException.cs | 82 + MSNPSharp/ProxySocket/ProxySocket.cs | 389 + MSNPSharp/ProxySocket/Socks4Handler.cs | 234 + MSNPSharp/ProxySocket/Socks5Handler.cs | 419 + MSNPSharp/ProxySocket/SocksHandler.cs | 204 + MSNPSharp/QRYFactory.cs | 150 + MSNPSharp/Resources/MSNPSharp_logo_128.png | Bin 0 -> 11682 bytes MSNPSharp/Resources/WLXLarge_default.gif | Bin 0 -> 6796 bytes MSNPSharp/Resources/msnpsharp.snk | Bin 0 -> 596 bytes MSNPSharp/SBMessageHandler.cs | 1821 ++++ MSNPSharp/SBMessageProcessor.cs | 160 + MSNPSharp/Schedulers.cs | 345 + MSNPSharp/Services/ABServiceBindingWrapper.cs | 72 + MSNPSharp/Services/ContactService.cs | 3187 ++++++ MSNPSharp/Services/IPEndPointCallback.cs | 73 + MSNPSharp/Services/MSNService.cs | 862 ++ MSNPSharp/Services/OIMService.cs | 695 ++ MSNPSharp/Services/OIMStoreServiceWrapper.cs | 75 + MSNPSharp/Services/RSIServiceWrapper.cs | 72 + .../Services/SecurityTokenServiceWrapper.cs | 177 + .../Services/SharingServiceBindingWrapper.cs | 71 + MSNPSharp/Services/StorageService.cs | 1079 ++ MSNPSharp/Services/StorageServiceWrapper.cs | 71 + MSNPSharp/Services/WhatsUpService.cs | 174 + .../Services/WhatsUpServiceBindingWrapper.cs | 72 + MSNPSharp/SingleSignOn.cs | 1048 ++ MSNPSharp/StrDictionary.cs | 164 + MSNPSharp/TextMessage.cs | 414 + MSNPSharp/UnauthorizedException.cs | 86 + .../ABAddResponseType.datasource | 10 + .../ABContactAddResponse.datasource | 10 + .../ABContactUpdateResponse.datasource | 10 + .../ABFindAllResponse.datasource | 10 + .../ABFindByContactsResponse.datasource | 10 + .../ABFindContactsPagedResponse.datasource | 10 + .../ABGroupAddResponse.datasource | 10 + .../ABGroupContactAddResponse.datasource | 10 + .../ABGroupContactDeleteResponse.datasource | 10 + .../ABGroupDeleteResponse.datasource | 10 + .../ABGroupUpdateResponse.datasource | 10 + .../AddDynamicItemResponseType.datasource | 10 + .../AddMemberResponse.datasource | 10 + .../BreakConnectionResponseType.datasource | 10 + .../CreateCircleResponse.datasource | 10 + .../CreateContactResponse.datasource | 10 + .../DeleteMemberResponse.datasource | 10 + .../FindMembershipResponse.datasource | 10 + ...tContactsRecentActivityResponse.datasource | 10 + .../ManageWLConnectionResponse.datasource | 10 + .../MSNWS.MSNABSharingService/Reference.cs | 9444 +++++++++++++++++ .../MSNWS.MSNABSharingService/Reference.map | 8 + .../msnab_datatypes.xsd | 925 ++ .../msnab_servicetypes.xsd | 599 ++ .../msnab_sharingservice.wsdl | 606 ++ .../MSNWS.MSNOIMStoreService/Reference.cs | 624 ++ .../MSNWS.MSNOIMStoreService/Reference.map | 9 + .../StoreResultType.datasource | 10 + .../oim_servicetypes.xsd | 59 + .../MSNWS.MSNOIMStoreService/oim_ws.wsdl | 60 + .../MSNWS.MSNOIMStoreService/utility.xsd | 202 + .../MSNWS.MSNOIMStoreService/wsrm.xsd | 130 + .../DeleteMessagesResponseType.datasource | 10 + .../GetMessageResponseType.datasource | 10 + .../MSNWS.MSNRSIService/Reference.cs | 651 ++ .../MSNWS.MSNRSIService/Reference.map | 9 + .../MSNWS.MSNRSIService/rsi_datatypes.xsd | 66 + .../MSNWS.MSNRSIService/rsi_faulttypes.xsd | 10 + .../MSNWS.MSNRSIService/rsi_servicetypes.xsd | 52 + .../MSNWS.MSNRSIService/rsi_ws.wsdl | 105 + .../Reference.cs | 5236 +++++++++ .../Reference.map | 19 + ...equestSecurityTokenResponseType.datasource | 10 + .../addressing-04-08.xsd | 99 + .../addressing.xsd | 113 + .../ps-fault.xsd | 119 + .../MSNWS.MSNSecurityTokenService/ps.wsdl | 115 + .../MSNWS.MSNSecurityTokenService/ps.xsd | 22 + .../soap-env-03-05.xsd | 109 + .../soap-env.xsd | 72 + .../sstc-saml-schema-assertion-1.xsd | 200 + .../ws-policy.xsd | 16 + .../ws-secext.xsd | 92 + .../ws-secureconversation.xsd | 60 + .../ws-trust.xsd | 127 + .../wss-utility.xsd | 90 + .../xenc-schema.xsd | 104 + .../MSNWS.MSNSecurityTokenService/xml.xsd | 270 + .../xmldsig-core-schema.xsd | 209 + .../CreateDocumentResponseType.datasource | 10 + .../CreateProfileResponse.datasource | 10 + .../FindDocumentsResultType.datasource | 10 + .../GetProfileResponse.datasource | 10 + .../MSNWS.MSNStorageService/Reference.cs | 2497 +++++ .../MSNWS.MSNStorageService/Reference.map | 8 + .../ShareItemResponseType.datasource | 10 + .../msnstorage_datatypes.xsd | 100 + .../msnstorage_servicetypes.xsd | 222 + .../msnstorage_ws.wsdl | 260 + MSNPSharp/Wink.cs | 50 + MSNPSharp/app.config | 31 + MSNPSharp/enums.cs | 1898 ++++ ProxyServer/AssemblyInfo.cs | 88 + ProxyServer/AuthBase.cs | 108 + ProxyServer/AuthNone.cs | 48 + ProxyServer/AuthUserPass.cs | 143 + ProxyServer/AuthenticationList.cs | 132 + ProxyServer/Client.cs | 206 + ProxyServer/ConsoleAttributes.cs | 478 + ProxyServer/FtpClient.cs | 342 + ProxyServer/FtpDataConnection.cs | 216 + ProxyServer/FtpListener.cs | 83 + ProxyServer/HttpClient.cs | 368 + ProxyServer/HttpListener.cs | 81 + ProxyServer/Listener.cs | 261 + ProxyServer/PortMapClient.cs | 95 + ProxyServer/PortMapListener.cs | 115 + ProxyServer/Proxy.cs | 429 + ProxyServer/ProxyConfig.cs | 488 + ProxyServer/ProxyServer.csproj | 180 + ProxyServer/ProxyServer.csproj.user | 13 + ProxyServer/Socks4Handler.cs | 151 + ProxyServer/Socks5Handler.cs | 277 + ProxyServer/SocksClient.cs | 154 + ProxyServer/SocksHandler.cs | 241 + ProxyServer/SocksListener.cs | 114 + .../MSNABSharingService/msnab_datatypes.xsd | 926 ++ .../msnab_servicetypes.xsd | 600 ++ .../msnab_sharingservice.wsdl | 607 ++ .../MSNOIMStoreService/oim_servicetypes.xsd | 60 + .../MSNOIMStoreService/oim_ws.wsdl | 61 + .../MSNOIMStoreService/utility.xsd | 203 + .../MSNOIMStoreService/wsrm.xsd | 131 + .../MSNRSIService/rsi_datatypes.xsd | 67 + .../MSNRSIService/rsi_faulttypes.xsd | 11 + .../MSNRSIService/rsi_servicetypes.xsd | 53 + .../MSNRSIService/rsi_ws.wsdl | 106 + .../Origin/WS-Trust.xsd | 386 + .../Origin/addressing-04-08.xsd | 149 + .../Origin/addressing.xsd | 149 + ...oasis-200401-wss-wssecurity-secext-1.0.xsd | 196 + ...asis-200401-wss-wssecurity-utility-1.0.xsd | 108 + .../Origin/soap-env-03-05.xsd | 165 + .../Origin/ws-policy.xsd | 88 + .../Origin/ws-secureconversation.xsd | 111 + .../Origin/xmldsig-core-schema.xsd | 318 + .../addressing-04-08.xsd | 149 + .../MSNSecurityTokenService/addressing.xsd | 132 + .../MSNSecurityTokenService/ps-fault.xsd | 120 + .../MSNSecurityTokenService/ps.wsdl | 116 + .../MSNSecurityTokenService/ps.xsd | 23 + .../soap-env-03-05.xsd | 135 + .../MSNSecurityTokenService/soap-env.xsd | 72 + .../sstc-saml-schema-assertion-1.1-cs.xsd | 201 + .../sstc-saml-schema-protocol-1.1-cs.xsd | 133 + .../MSNSecurityTokenService/ws-policy.xsd | 16 + .../MSNSecurityTokenService/ws-secext.xsd | 93 + .../ws-secureconversation.xsd | 111 + .../MSNSecurityTokenService/ws-trust.xsd | 128 + .../MSNSecurityTokenService/wss-utility.xsd | 104 + .../MSNSecurityTokenService/xenc-schema.xsd | 105 + .../MSNSecurityTokenService/xml.xsd | 287 + .../xmldsig-core-schema.xsd | 258 + .../MSNSpaceService/space_ws.wsdl | 42 + .../MSNSpaceService/space_ws_datatype.xsd | 133 + .../MSNSpaceService/space_ws_servicetype.xsd | 29 + .../msnstorage_datatypes.xsd | 101 + .../msnstorage_servicetypes.xsd | 223 + .../MSNStorageService/msnstorage_ws.wsdl | 261 + 312 files changed, 95444 insertions(+) create mode 100644 Example/AddContactForm.Designer.cs create mode 100644 Example/AddContactForm.cs create mode 100644 Example/AddContactForm.resx create mode 100644 Example/ContactCardForm.Designer.cs create mode 100644 Example/ContactCardForm.cs create mode 100644 Example/ContactCardForm.resx create mode 100644 Example/ConversationForm.cs create mode 100644 Example/ConversationForm.resx create mode 100644 Example/DotMSNClient.Designer.cs create mode 100644 Example/DotMSNClient.cs create mode 100644 Example/DotMSNClient.csproj create mode 100644 Example/DotMSNClient.csproj.user create mode 100644 Example/DotMSNClient.resx create mode 100644 Example/FileTransferForm.Designer.cs create mode 100644 Example/FileTransferForm.cs create mode 100644 Example/FileTransferForm.resx create mode 100644 Example/ImportContacts.Designer.cs create mode 100644 Example/ImportContacts.cs create mode 100644 Example/ImportContacts.resx create mode 100644 Example/MSNPSharp_logo.ico create mode 100644 Example/MusicForm.Designer.cs create mode 100644 Example/MusicForm.cs create mode 100644 Example/MusicForm.resx create mode 100644 Example/Properties/AssemblyInfo.cs create mode 100644 Example/Properties/Resources.Designer.cs create mode 100644 Example/Properties/Resources.resx create mode 100644 Example/RemoveContactForm.Designer.cs create mode 100644 Example/RemoveContactForm.cs create mode 100644 Example/RemoveContactForm.resx create mode 100644 Example/Resources/Color_fontHS.png create mode 100644 Example/Resources/MSNPSharp_logo.ico create mode 100644 Example/Resources/MSNPSharp_logo_small.ico create mode 100644 Example/Resources/YahooMessenger_logo.png create mode 100644 Example/Resources/app_banner.png create mode 100644 Example/Resources/file.png create mode 100644 Example/Resources/inner_emoicon.png create mode 100644 Example/Resources/loading.gif create mode 100644 Example/Resources/msn_ico.ico create mode 100644 Example/Resources/nudge.png create mode 100644 Example/Resources/smileys/biggrin.gif create mode 100644 Example/Resources/smileys/sad.gif create mode 100644 Example/Resources/smileys/smiley.gif create mode 100644 Example/Resources/smileys/tongueout.gif create mode 100644 Example/Resources/smileys/wink.gif create mode 100644 Example/Resources/status/away.png create mode 100644 Example/Resources/status/busy.png create mode 100644 Example/Resources/status/circle.png create mode 100644 Example/Resources/status/closed.png create mode 100644 Example/Resources/status/hidden.png create mode 100644 Example/Resources/status/idle.png create mode 100644 Example/Resources/status/offline.png create mode 100644 Example/Resources/status/online.png create mode 100644 Example/Resources/status/open.png create mode 100644 Example/Resources/yahoo_ico.ico create mode 100644 Example/ReverseAddedForm.Designer.cs create mode 100644 Example/ReverseAddedForm.cs create mode 100644 Example/ReverseAddedForm.resx create mode 100644 Example/RtfRichTextBox.cs create mode 100644 Example/TraceForm.Designer.cs create mode 100644 Example/TraceForm.cs create mode 100644 Example/TraceForm.resx create mode 100644 MSNPSharp.sln create mode 100644 MSNPSharp/Circle.Obsolete.cs create mode 100644 MSNPSharp/Circle.cs create mode 100644 MSNPSharp/CircleInviter.cs create mode 100644 MSNPSharp/CircleList.cs create mode 100644 MSNPSharp/ClassDiagram1.cd create mode 100644 MSNPSharp/Comparers.cs create mode 100644 MSNPSharp/Configuration.cs create mode 100644 MSNPSharp/ConnectivityException.cs create mode 100644 MSNPSharp/ConnectivitySettings.cs create mode 100644 MSNPSharp/Contact.cs create mode 100644 MSNPSharp/ContactGroup.cs create mode 100644 MSNPSharp/ContactGroupList.cs create mode 100644 MSNPSharp/ContactList.cs create mode 100644 MSNPSharp/ContactManager.cs create mode 100644 MSNPSharp/Conversation.cs create mode 100644 MSNPSharp/ConversationID.cs create mode 100644 MSNPSharp/Core/BitUtility.cs create mode 100644 MSNPSharp/Core/Converter.cs create mode 100644 MSNPSharp/Core/IMessageHandler.cs create mode 100644 MSNPSharp/Core/MSNMessage.cs create mode 100644 MSNPSharp/Core/MessagePool.cs create mode 100644 MSNPSharp/Core/MessageProcessor.cs create mode 100644 MSNPSharp/Core/MimeDictionary.cs create mode 100644 MSNPSharp/Core/MimeMessage.cs create mode 100644 MSNPSharp/Core/NSMessage.cs create mode 100644 MSNPSharp/Core/NSMessagePool.cs create mode 100644 MSNPSharp/Core/NSPayLoadMessage.cs create mode 100644 MSNPSharp/Core/NetworkMessage.cs create mode 100644 MSNPSharp/Core/NotificationMessage.cs create mode 100644 MSNPSharp/Core/PersistentStream.cs create mode 100644 MSNPSharp/Core/SBMessage.cs create mode 100644 MSNPSharp/Core/SBMessagePool.cs create mode 100644 MSNPSharp/Core/SocketMessageProcessor.cs create mode 100644 MSNPSharp/Core/TextPayloadMessage.cs create mode 100644 MSNPSharp/Credentials.cs create mode 100644 MSNPSharp/DataTransfer/MSNSLPHandler.cs create mode 100644 MSNPSharp/DataTransfer/MSNSLPInvitationEventArgs.cs create mode 100644 MSNPSharp/DataTransfer/MSNSLPMessage.cs create mode 100644 MSNPSharp/DataTransfer/MSNSLPTransferProperties.cs create mode 100644 MSNPSharp/DataTransfer/P2PDCPool.cs create mode 100644 MSNPSharp/DataTransfer/P2PDirectProcessor.cs create mode 100644 MSNPSharp/DataTransfer/P2PHandler.cs create mode 100644 MSNPSharp/DataTransfer/P2PHeader.cs create mode 100644 MSNPSharp/DataTransfer/P2PMessage.cs create mode 100644 MSNPSharp/DataTransfer/P2PMessagePool.cs create mode 100644 MSNPSharp/DataTransfer/P2PMessageSession.DC.cs create mode 100644 MSNPSharp/DataTransfer/P2PMessageSession.cs create mode 100644 MSNPSharp/DataTransfer/P2PTransferSession.cs create mode 100644 MSNPSharp/DisplayImage.cs create mode 100644 MSNPSharp/Emoticon.cs create mode 100644 MSNPSharp/EmoticonMessage.cs create mode 100644 MSNPSharp/EndPointData.cs create mode 100644 MSNPSharp/EventArgs.cs create mode 100644 MSNPSharp/Framework.cs create mode 100644 MSNPSharp/IO/DeltasList.cs create mode 100644 MSNPSharp/IO/IO.cs create mode 100644 MSNPSharp/IO/MCLSerializer.cs create mode 100644 MSNPSharp/IO/SerializableClasses.cs create mode 100644 MSNPSharp/IO/SerializableDictionary.cs create mode 100644 MSNPSharp/IO/SerializableMemoryStream.cs create mode 100644 MSNPSharp/IO/XMLContactList.cs create mode 100644 MSNPSharp/MSNObject.cs create mode 100644 MSNPSharp/MSNPSharp.csproj create mode 100644 MSNPSharp/MSNPSharp.csproj.user create mode 100644 MSNPSharp/MSNPSharpException.cs create mode 100644 MSNPSharp/MailEventArgs.cs create mode 100644 MSNPSharp/MessageManager.cs create mode 100644 MSNPSharp/MessageManagerEventArgs.cs create mode 100644 MSNPSharp/Messenger.cs create mode 100644 MSNPSharp/MobileMessage.cs create mode 100644 MSNPSharp/NSMessageHandler.Obsolete.cs create mode 100644 MSNPSharp/NSMessageHandler.cs create mode 100644 MSNPSharp/NSMessageProcessor.cs create mode 100644 MSNPSharp/Owner.cs create mode 100644 MSNPSharp/PersonalMessage.cs create mode 100644 MSNPSharp/Properties/AssemblyInfo.cs create mode 100644 MSNPSharp/Properties/Resources.Designer.cs create mode 100644 MSNPSharp/Properties/Resources.resx create mode 100644 MSNPSharp/ProxySocket/AuthMethod.cs create mode 100644 MSNPSharp/ProxySocket/AuthNone.cs create mode 100644 MSNPSharp/ProxySocket/AuthUserPass.cs create mode 100644 MSNPSharp/ProxySocket/IAsyncProxyResult.cs create mode 100644 MSNPSharp/ProxySocket/ProxyException.cs create mode 100644 MSNPSharp/ProxySocket/ProxySocket.cs create mode 100644 MSNPSharp/ProxySocket/Socks4Handler.cs create mode 100644 MSNPSharp/ProxySocket/Socks5Handler.cs create mode 100644 MSNPSharp/ProxySocket/SocksHandler.cs create mode 100644 MSNPSharp/QRYFactory.cs create mode 100644 MSNPSharp/Resources/MSNPSharp_logo_128.png create mode 100644 MSNPSharp/Resources/WLXLarge_default.gif create mode 100644 MSNPSharp/Resources/msnpsharp.snk create mode 100644 MSNPSharp/SBMessageHandler.cs create mode 100644 MSNPSharp/SBMessageProcessor.cs create mode 100644 MSNPSharp/Schedulers.cs create mode 100644 MSNPSharp/Services/ABServiceBindingWrapper.cs create mode 100644 MSNPSharp/Services/ContactService.cs create mode 100644 MSNPSharp/Services/IPEndPointCallback.cs create mode 100644 MSNPSharp/Services/MSNService.cs create mode 100644 MSNPSharp/Services/OIMService.cs create mode 100644 MSNPSharp/Services/OIMStoreServiceWrapper.cs create mode 100644 MSNPSharp/Services/RSIServiceWrapper.cs create mode 100644 MSNPSharp/Services/SecurityTokenServiceWrapper.cs create mode 100644 MSNPSharp/Services/SharingServiceBindingWrapper.cs create mode 100644 MSNPSharp/Services/StorageService.cs create mode 100644 MSNPSharp/Services/StorageServiceWrapper.cs create mode 100644 MSNPSharp/Services/WhatsUpService.cs create mode 100644 MSNPSharp/Services/WhatsUpServiceBindingWrapper.cs create mode 100644 MSNPSharp/SingleSignOn.cs create mode 100644 MSNPSharp/StrDictionary.cs create mode 100644 MSNPSharp/TextMessage.cs create mode 100644 MSNPSharp/UnauthorizedException.cs create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABAddResponseType.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABContactAddResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABContactUpdateResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABFindAllResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABFindByContactsResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABFindContactsPagedResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABGroupAddResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABGroupContactAddResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABGroupContactDeleteResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABGroupDeleteResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ABGroupUpdateResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/AddDynamicItemResponseType.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/AddMemberResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/BreakConnectionResponseType.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/CreateCircleResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/CreateContactResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/DeleteMemberResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/FindMembershipResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/GetContactsRecentActivityResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/ManageWLConnectionResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/Reference.cs create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/Reference.map create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/msnab_datatypes.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/msnab_servicetypes.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNABSharingService/msnab_sharingservice.wsdl create mode 100644 MSNPSharp/Web References/MSNWS.MSNOIMStoreService/Reference.cs create mode 100644 MSNPSharp/Web References/MSNWS.MSNOIMStoreService/Reference.map create mode 100644 MSNPSharp/Web References/MSNWS.MSNOIMStoreService/StoreResultType.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNOIMStoreService/oim_servicetypes.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNOIMStoreService/oim_ws.wsdl create mode 100644 MSNPSharp/Web References/MSNWS.MSNOIMStoreService/utility.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNOIMStoreService/wsrm.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNRSIService/DeleteMessagesResponseType.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNRSIService/GetMessageResponseType.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNRSIService/Reference.cs create mode 100644 MSNPSharp/Web References/MSNWS.MSNRSIService/Reference.map create mode 100644 MSNPSharp/Web References/MSNWS.MSNRSIService/rsi_datatypes.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNRSIService/rsi_faulttypes.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNRSIService/rsi_servicetypes.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNRSIService/rsi_ws.wsdl create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/Reference.cs create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/Reference.map create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/RequestSecurityTokenResponseType.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/addressing-04-08.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/addressing.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/ps-fault.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/ps.wsdl create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/ps.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/soap-env-03-05.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/soap-env.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/sstc-saml-schema-assertion-1.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/ws-policy.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/ws-secext.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/ws-secureconversation.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/ws-trust.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/wss-utility.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/xenc-schema.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/xml.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNSecurityTokenService/xmldsig-core-schema.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNStorageService/CreateDocumentResponseType.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNStorageService/CreateProfileResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNStorageService/FindDocumentsResultType.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNStorageService/GetProfileResponse.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNStorageService/Reference.cs create mode 100644 MSNPSharp/Web References/MSNWS.MSNStorageService/Reference.map create mode 100644 MSNPSharp/Web References/MSNWS.MSNStorageService/ShareItemResponseType.datasource create mode 100644 MSNPSharp/Web References/MSNWS.MSNStorageService/msnstorage_datatypes.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNStorageService/msnstorage_servicetypes.xsd create mode 100644 MSNPSharp/Web References/MSNWS.MSNStorageService/msnstorage_ws.wsdl create mode 100644 MSNPSharp/Wink.cs create mode 100644 MSNPSharp/app.config create mode 100644 MSNPSharp/enums.cs create mode 100644 ProxyServer/AssemblyInfo.cs create mode 100644 ProxyServer/AuthBase.cs create mode 100644 ProxyServer/AuthNone.cs create mode 100644 ProxyServer/AuthUserPass.cs create mode 100644 ProxyServer/AuthenticationList.cs create mode 100644 ProxyServer/Client.cs create mode 100644 ProxyServer/ConsoleAttributes.cs create mode 100644 ProxyServer/FtpClient.cs create mode 100644 ProxyServer/FtpDataConnection.cs create mode 100644 ProxyServer/FtpListener.cs create mode 100644 ProxyServer/HttpClient.cs create mode 100644 ProxyServer/HttpListener.cs create mode 100644 ProxyServer/Listener.cs create mode 100644 ProxyServer/PortMapClient.cs create mode 100644 ProxyServer/PortMapListener.cs create mode 100644 ProxyServer/Proxy.cs create mode 100644 ProxyServer/ProxyConfig.cs create mode 100644 ProxyServer/ProxyServer.csproj create mode 100644 ProxyServer/ProxyServer.csproj.user create mode 100644 ProxyServer/Socks4Handler.cs create mode 100644 ProxyServer/Socks5Handler.cs create mode 100644 ProxyServer/SocksClient.cs create mode 100644 ProxyServer/SocksHandler.cs create mode 100644 ProxyServer/SocksListener.cs create mode 100644 WebServiceDefAndSchemas/MSNABSharingService/msnab_datatypes.xsd create mode 100644 WebServiceDefAndSchemas/MSNABSharingService/msnab_servicetypes.xsd create mode 100644 WebServiceDefAndSchemas/MSNABSharingService/msnab_sharingservice.wsdl create mode 100644 WebServiceDefAndSchemas/MSNOIMStoreService/oim_servicetypes.xsd create mode 100644 WebServiceDefAndSchemas/MSNOIMStoreService/oim_ws.wsdl create mode 100644 WebServiceDefAndSchemas/MSNOIMStoreService/utility.xsd create mode 100644 WebServiceDefAndSchemas/MSNOIMStoreService/wsrm.xsd create mode 100644 WebServiceDefAndSchemas/MSNRSIService/rsi_datatypes.xsd create mode 100644 WebServiceDefAndSchemas/MSNRSIService/rsi_faulttypes.xsd create mode 100644 WebServiceDefAndSchemas/MSNRSIService/rsi_servicetypes.xsd create mode 100644 WebServiceDefAndSchemas/MSNRSIService/rsi_ws.wsdl create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/Origin/WS-Trust.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/Origin/addressing-04-08.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/Origin/addressing.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/Origin/oasis-200401-wss-wssecurity-secext-1.0.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/Origin/oasis-200401-wss-wssecurity-utility-1.0.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/Origin/soap-env-03-05.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/Origin/ws-policy.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/Origin/ws-secureconversation.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/Origin/xmldsig-core-schema.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/addressing-04-08.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/addressing.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/ps-fault.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/ps.wsdl create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/ps.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/soap-env-03-05.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/soap-env.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/sstc-saml-schema-assertion-1.1-cs.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/sstc-saml-schema-protocol-1.1-cs.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/ws-policy.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/ws-secext.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/ws-secureconversation.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/ws-trust.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/wss-utility.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/xenc-schema.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/xml.xsd create mode 100644 WebServiceDefAndSchemas/MSNSecurityTokenService/xmldsig-core-schema.xsd create mode 100644 WebServiceDefAndSchemas/MSNSpaceService/space_ws.wsdl create mode 100644 WebServiceDefAndSchemas/MSNSpaceService/space_ws_datatype.xsd create mode 100644 WebServiceDefAndSchemas/MSNSpaceService/space_ws_servicetype.xsd create mode 100644 WebServiceDefAndSchemas/MSNStorageService/msnstorage_datatypes.xsd create mode 100644 WebServiceDefAndSchemas/MSNStorageService/msnstorage_servicetypes.xsd create mode 100644 WebServiceDefAndSchemas/MSNStorageService/msnstorage_ws.wsdl diff --git a/Example/AddContactForm.Designer.cs b/Example/AddContactForm.Designer.cs new file mode 100644 index 0000000..de731e6 --- /dev/null +++ b/Example/AddContactForm.Designer.cs @@ -0,0 +1,123 @@ +namespace MSNPSharpClient +{ + partial class AddContactForm + { + /// + /// 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() + { + this.lblAccount = new System.Windows.Forms.Label(); + this.txtAccount = new System.Windows.Forms.TextBox(); + this.txtInvitation = new System.Windows.Forms.TextBox(); + this.lblInvitation = new System.Windows.Forms.Label(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblAccount + // + this.lblAccount.AutoSize = true; + this.lblAccount.Location = new System.Drawing.Point(4, 21); + this.lblAccount.Name = "lblAccount"; + this.lblAccount.Size = new System.Drawing.Size(106, 13); + this.lblAccount.TabIndex = 0; + this.lblAccount.Text = "Messenger address:*"; + // + // txtAccount + // + this.txtAccount.CharacterCasing = System.Windows.Forms.CharacterCasing.Lower; + this.txtAccount.Location = new System.Drawing.Point(115, 18); + this.txtAccount.Name = "txtAccount"; + this.txtAccount.Size = new System.Drawing.Size(250, 20); + this.txtAccount.TabIndex = 1; + // + // txtInvitation + // + this.txtInvitation.Location = new System.Drawing.Point(115, 47); + this.txtInvitation.Name = "txtInvitation"; + this.txtInvitation.Size = new System.Drawing.Size(250, 20); + this.txtInvitation.TabIndex = 2; + // + // lblInvitation + // + this.lblInvitation.AutoSize = true; + this.lblInvitation.Location = new System.Drawing.Point(12, 50); + this.lblInvitation.Name = "lblInvitation"; + this.lblInvitation.Size = new System.Drawing.Size(98, 13); + this.lblInvitation.TabIndex = 4; + this.lblInvitation.Text = "Invitation message:"; + // + // btnOK + // + this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnOK.Location = new System.Drawing.Point(209, 84); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(75, 23); + this.btnOK.TabIndex = 3; + this.btnOK.Text = "OK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btn_Click); + // + // btnCancel + // + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(290, 84); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(75, 23); + this.btnCancel.TabIndex = 4; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btn_Click); + // + // AddContactForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(373, 119); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.txtInvitation); + this.Controls.Add(this.lblInvitation); + this.Controls.Add(this.txtAccount); + this.Controls.Add(this.lblAccount); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AddContactForm"; + this.Text = "Add New Contact"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblAccount; + private System.Windows.Forms.TextBox txtAccount; + private System.Windows.Forms.TextBox txtInvitation; + private System.Windows.Forms.Label lblInvitation; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Button btnCancel; + } +} \ No newline at end of file diff --git a/Example/AddContactForm.cs b/Example/AddContactForm.cs new file mode 100644 index 0000000..d0a3634 --- /dev/null +++ b/Example/AddContactForm.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MSNPSharpClient +{ + public partial class AddContactForm : Form + { + public AddContactForm(string account) + { + InitializeComponent(); + + if (!String.IsNullOrEmpty(account)) + { + this.account = account; + txtAccount.Text = account; + } + } + + private string account; + public string Account + { + get + { + return account; + } + } + + private string invitationMessage; + public string InvitationMessage + { + get + { + return invitationMessage; + } + } + + private void btn_Click(object sender, EventArgs e) + { + account = txtAccount.Text; + invitationMessage = txtInvitation.Text; + + Close(); + } + } +} \ No newline at end of file diff --git a/Example/AddContactForm.resx b/Example/AddContactForm.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Example/AddContactForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Example/ContactCardForm.Designer.cs b/Example/ContactCardForm.Designer.cs new file mode 100644 index 0000000..ca17b2e --- /dev/null +++ b/Example/ContactCardForm.Designer.cs @@ -0,0 +1,240 @@ +namespace MSNPSharpClient +{ + partial class ContactCardForm + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.pnlSpace = new System.Windows.Forms.Panel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.lblSpaceTitle = new System.Windows.Forms.LinkLabel(); + this.lblDisplayName = new System.Windows.Forms.Label(); + this.picDisplayImage = new System.Windows.Forms.PictureBox(); + this.pnlAlbum = new System.Windows.Forms.Panel(); + this.tlpnlAlbum = new System.Windows.Forms.TableLayoutPanel(); + this.lnkAlbumName = new System.Windows.Forms.LinkLabel(); + this.pnlBlog = new System.Windows.Forms.Panel(); + this.lnkBlogContent = new System.Windows.Forms.LinkLabel(); + this.lnkBlogTitle = new System.Windows.Forms.LinkLabel(); + this.pnlProfile = new System.Windows.Forms.Panel(); + this.ttips = new System.Windows.Forms.ToolTip(this.components); + this.pnlSpace.SuspendLayout(); + this.panel3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picDisplayImage)).BeginInit(); + this.pnlAlbum.SuspendLayout(); + this.pnlBlog.SuspendLayout(); + this.SuspendLayout(); + // + // pnlSpace + // + this.pnlSpace.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); + this.pnlSpace.Controls.Add(this.panel3); + this.pnlSpace.Controls.Add(this.picDisplayImage); + this.pnlSpace.Dock = System.Windows.Forms.DockStyle.Top; + this.pnlSpace.Location = new System.Drawing.Point(0, 0); + this.pnlSpace.Name = "pnlSpace"; + this.pnlSpace.Padding = new System.Windows.Forms.Padding(10); + this.pnlSpace.Size = new System.Drawing.Size(272, 76); + this.pnlSpace.TabIndex = 1; + // + // panel3 + // + this.panel3.Controls.Add(this.lblSpaceTitle); + this.panel3.Controls.Add(this.lblDisplayName); + this.panel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel3.Location = new System.Drawing.Point(69, 10); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(193, 56); + this.panel3.TabIndex = 2; + // + // lblSpaceTitle + // + this.lblSpaceTitle.Dock = System.Windows.Forms.DockStyle.Top; + this.lblSpaceTitle.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.lblSpaceTitle.Location = new System.Drawing.Point(0, 23); + this.lblSpaceTitle.Margin = new System.Windows.Forms.Padding(0); + this.lblSpaceTitle.Name = "lblSpaceTitle"; + this.lblSpaceTitle.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lblSpaceTitle.Size = new System.Drawing.Size(193, 19); + this.lblSpaceTitle.TabIndex = 2; + this.lblSpaceTitle.TabStop = true; + this.lblSpaceTitle.Text = "Space Title"; + this.lblSpaceTitle.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lblSpaceTitle_LinkClicked); + // + // lblDisplayName + // + this.lblDisplayName.Dock = System.Windows.Forms.DockStyle.Top; + this.lblDisplayName.Location = new System.Drawing.Point(0, 0); + this.lblDisplayName.Margin = new System.Windows.Forms.Padding(0); + this.lblDisplayName.Name = "lblDisplayName"; + this.lblDisplayName.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lblDisplayName.Size = new System.Drawing.Size(193, 23); + this.lblDisplayName.TabIndex = 1; + this.lblDisplayName.Text = "Display Name"; + // + // picDisplayImage + // + this.picDisplayImage.BackColor = System.Drawing.Color.White; + this.picDisplayImage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.picDisplayImage.Dock = System.Windows.Forms.DockStyle.Left; + this.picDisplayImage.Location = new System.Drawing.Point(10, 10); + this.picDisplayImage.Name = "picDisplayImage"; + this.picDisplayImage.Size = new System.Drawing.Size(59, 56); + this.picDisplayImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.picDisplayImage.TabIndex = 1; + this.picDisplayImage.TabStop = false; + // + // pnlAlbum + // + this.pnlAlbum.BackColor = System.Drawing.Color.Linen; + this.pnlAlbum.Controls.Add(this.tlpnlAlbum); + this.pnlAlbum.Controls.Add(this.lnkAlbumName); + this.pnlAlbum.Dock = System.Windows.Forms.DockStyle.Top; + this.pnlAlbum.Location = new System.Drawing.Point(0, 76); + this.pnlAlbum.Name = "pnlAlbum"; + this.pnlAlbum.Padding = new System.Windows.Forms.Padding(5); + this.pnlAlbum.Size = new System.Drawing.Size(272, 65); + this.pnlAlbum.TabIndex = 2; + // + // tlpnlAlbum + // + this.tlpnlAlbum.ColumnCount = 6; + this.tlpnlAlbum.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tlpnlAlbum.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tlpnlAlbum.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tlpnlAlbum.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tlpnlAlbum.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tlpnlAlbum.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 16.66667F)); + this.tlpnlAlbum.Dock = System.Windows.Forms.DockStyle.Fill; + this.tlpnlAlbum.Location = new System.Drawing.Point(5, 17); + this.tlpnlAlbum.Name = "tlpnlAlbum"; + this.tlpnlAlbum.RowCount = 1; + this.tlpnlAlbum.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tlpnlAlbum.Size = new System.Drawing.Size(262, 43); + this.tlpnlAlbum.TabIndex = 1; + // + // lnkAlbumName + // + this.lnkAlbumName.Dock = System.Windows.Forms.DockStyle.Top; + this.lnkAlbumName.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.lnkAlbumName.Location = new System.Drawing.Point(5, 5); + this.lnkAlbumName.Name = "lnkAlbumName"; + this.lnkAlbumName.Size = new System.Drawing.Size(262, 12); + this.lnkAlbumName.TabIndex = 0; + this.lnkAlbumName.TabStop = true; + this.lnkAlbumName.Text = "Album Name"; + this.lnkAlbumName.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkAlbumName_LinkClicked); + // + // pnlBlog + // + this.pnlBlog.BackColor = System.Drawing.Color.Linen; + this.pnlBlog.Controls.Add(this.lnkBlogContent); + this.pnlBlog.Controls.Add(this.lnkBlogTitle); + this.pnlBlog.Dock = System.Windows.Forms.DockStyle.Top; + this.pnlBlog.Location = new System.Drawing.Point(0, 141); + this.pnlBlog.Name = "pnlBlog"; + this.pnlBlog.Padding = new System.Windows.Forms.Padding(5); + this.pnlBlog.Size = new System.Drawing.Size(272, 58); + this.pnlBlog.TabIndex = 3; + // + // lnkBlogContent + // + this.lnkBlogContent.Dock = System.Windows.Forms.DockStyle.Fill; + this.lnkBlogContent.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.lnkBlogContent.Location = new System.Drawing.Point(5, 17); + this.lnkBlogContent.Name = "lnkBlogContent"; + this.lnkBlogContent.Size = new System.Drawing.Size(262, 36); + this.lnkBlogContent.TabIndex = 1; + this.lnkBlogContent.TabStop = true; + this.lnkBlogContent.Text = "Blog Content"; + this.lnkBlogContent.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkBlogContent_LinkClicked); + // + // lnkBlogTitle + // + this.lnkBlogTitle.Dock = System.Windows.Forms.DockStyle.Top; + this.lnkBlogTitle.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.lnkBlogTitle.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.lnkBlogTitle.Location = new System.Drawing.Point(5, 5); + this.lnkBlogTitle.Name = "lnkBlogTitle"; + this.lnkBlogTitle.Size = new System.Drawing.Size(262, 12); + this.lnkBlogTitle.TabIndex = 0; + this.lnkBlogTitle.TabStop = true; + this.lnkBlogTitle.Text = "Blog Title"; + this.lnkBlogTitle.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkBlogTitle_LinkClicked); + // + // pnlProfile + // + this.pnlProfile.BackColor = System.Drawing.Color.Linen; + this.pnlProfile.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlProfile.Location = new System.Drawing.Point(0, 199); + this.pnlProfile.Name = "pnlProfile"; + this.pnlProfile.Padding = new System.Windows.Forms.Padding(5); + this.pnlProfile.Size = new System.Drawing.Size(272, 35); + this.pnlProfile.TabIndex = 4; + // + // ContactCardForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(272, 234); + this.Controls.Add(this.pnlProfile); + this.Controls.Add(this.pnlBlog); + this.Controls.Add(this.pnlAlbum); + this.Controls.Add(this.pnlSpace); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.Name = "ContactCardForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "ContactCard"; + this.Load += new System.EventHandler(this.ContactCardForm_Load); + this.pnlSpace.ResumeLayout(false); + this.panel3.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.picDisplayImage)).EndInit(); + this.pnlAlbum.ResumeLayout(false); + this.pnlBlog.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel pnlSpace; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.LinkLabel lblSpaceTitle; + private System.Windows.Forms.Label lblDisplayName; + private System.Windows.Forms.PictureBox picDisplayImage; + private System.Windows.Forms.Panel pnlAlbum; + private System.Windows.Forms.TableLayoutPanel tlpnlAlbum; + private System.Windows.Forms.LinkLabel lnkAlbumName; + private System.Windows.Forms.Panel pnlBlog; + private System.Windows.Forms.Panel pnlProfile; + private System.Windows.Forms.LinkLabel lnkBlogContent; + private System.Windows.Forms.LinkLabel lnkBlogTitle; + private System.Windows.Forms.ToolTip ttips; + + } +} \ No newline at end of file diff --git a/Example/ContactCardForm.cs b/Example/ContactCardForm.cs new file mode 100644 index 0000000..6521a72 --- /dev/null +++ b/Example/ContactCardForm.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using MSNPSharp; +using System.Diagnostics; + +namespace MSNPSharpClient +{ + public partial class ContactCardForm : Form + { + private ContactCard card = null; + + public ContactCardForm(ContactCard cc) + { + InitializeComponent(); + card = cc; + } + + private void ContactCardForm_Load(object sender, EventArgs e) + { + lblDisplayName.Text = card.DisplayName; + lblSpaceTitle.Text = (card.Space != null) ? card.Space.Title : String.Empty; + + if (String.IsNullOrEmpty(card.DisplayImageUrl)) + { + picDisplayImage.Visible = false; + } + else + { + picDisplayImage.LoadAsync(card.DisplayImageUrl); + } + + if (card.Album != null) + { + lnkAlbumName.Text = card.Album.Title; + int col = 0; + foreach (ThumbnailImage img in card.Album.Photos) //Setting the thumbnail pictures. + { + PictureBox lnkPic = new PictureBox(); + lnkPic.Dock = DockStyle.Fill; + lnkPic.Margin = new Padding(6); + lnkPic.BorderStyle = BorderStyle.FixedSingle; + lnkPic.SizeMode = PictureBoxSizeMode.Zoom; + lnkPic.BackColor = Color.White; + lnkPic.LoadAsync(img.ThumbnailUrl); + + tlpnlAlbum.Controls.Add(lnkPic, col, 0); + lnkPic.Tag = col; + lnkPic.Visible = true; + lnkPic.Click += new EventHandler(lnkPic_Click); + ttips.SetToolTip(lnkPic, img.ToolTip); + col++; + } + } + else + { + pnlAlbum.Visible = false; + } + + if (card.NewPost != null) + { + lnkBlogTitle.Text = card.NewPost.Title; + ttips.SetToolTip(lnkBlogTitle, card.NewPost.Description); + lnkBlogContent.Text = card.NewPost.Description; + ttips.SetToolTip(lnkBlogContent, card.NewPost.Description); + } + else + { + pnlBlog.Visible = false; + } + + Text = card.DisplayName + "'s ContactCard"; + } + + void lnkPic_Click(object sender, EventArgs e) + { + Process.Start(card.Album.Photos[(int)((PictureBox)sender).Tag].Url); + } + + void lnkPic_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start(card.Album.Photos[(int)((LinkLabel)sender).Tag].Url); + } + + private void lblSpaceTitle_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start(card.Space.Url); + } + + private void lnkAlbumName_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start(card.Album.Url); + } + + private void lnkBlogTitle_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start(card.NewPost.Url); + } + + private void lnkBlogContent_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start(card.NewPost.Url); + } + } +} \ No newline at end of file diff --git a/Example/ContactCardForm.resx b/Example/ContactCardForm.resx new file mode 100644 index 0000000..1d5cd69 --- /dev/null +++ b/Example/ContactCardForm.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Example/ConversationForm.cs b/Example/ConversationForm.cs new file mode 100644 index 0000000..042b525 --- /dev/null +++ b/Example/ConversationForm.cs @@ -0,0 +1,1077 @@ +using System; +using System.IO; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Collections; +using System.Windows.Forms; +using System.ComponentModel; +using System.Drawing.Imaging; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; + +namespace MSNPSharpClient +{ + using MSNPSharp; + using MSNPSharp.DataTransfer; + using MSNPSharp.Core; + using MSNPSharp.Utilities; + + /// + /// Summary description for ConversationForm. + /// + public class ConversationForm : System.Windows.Forms.Form + { + private IContainer components; + #region Windows Form Designer generated code + + private Panel panel1; + private TextBox inputTextBox; + private Panel panel2; + private RtfRichTextBox richTextHistory; + private PictureBox displayOwner; + private PictureBox displayUser; + + private OpenFileDialog openFileDialog; + private ToolStrip tsMessage; + private ToolStripComboBox cbMessageFontName; + private ToolStripComboBox cbMessageFontSize; + private ToolStripSeparator tssMessageSeperator1; + private ToolStripButton bMessageBold; + private ToolStripButton bMessageItalic; + private ToolStripButton bMessageUnderline; + private ToolStripSeparator tssMessageSeperator2; + private ToolStripButton bMessageSend; + private ToolStripButton bMessageSendNudge; + private Button btnSendFiles; + private Button btnInviteUsers; + private Button btnCustomEmoticon; + private Button btnActivityTest; + private ToolStripDropDownButton bMessageInsertEmoticon; + private ToolStripMenuItem toolStripMenuItem1; + private ToolStripMenuItem bigRinToolStripMenuItem; + private ToolStripMenuItem sadToolStripMenuItem; + private ToolStripMenuItem winkToolStripMenuItem; + private ToolStripMenuItem tongueOutToolStripMenuItem; + private ContextMenuStrip onlineUsersDropDown; + private ToolStripButton bMessageFontColor; + private OpenFileDialog openCustomEmoticonDialog; + private ColorDialog dlgColor; + + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tsMessage = new System.Windows.Forms.ToolStrip(); + this.bMessageInsertEmoticon = new System.Windows.Forms.ToolStripDropDownButton(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.bigRinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.winkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tongueOutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bMessageSendNudge = new System.Windows.Forms.ToolStripButton(); + this.tssMessageSeperator1 = new System.Windows.Forms.ToolStripSeparator(); + this.bMessageFontColor = new System.Windows.Forms.ToolStripButton(); + this.bMessageBold = new System.Windows.Forms.ToolStripButton(); + this.bMessageItalic = new System.Windows.Forms.ToolStripButton(); + this.bMessageUnderline = new System.Windows.Forms.ToolStripButton(); + this.cbMessageFontName = new System.Windows.Forms.ToolStripComboBox(); + this.cbMessageFontSize = new System.Windows.Forms.ToolStripComboBox(); + this.tssMessageSeperator2 = new System.Windows.Forms.ToolStripSeparator(); + this.bMessageSend = new System.Windows.Forms.ToolStripButton(); + this.displayOwner = new System.Windows.Forms.PictureBox(); + this.inputTextBox = new System.Windows.Forms.TextBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnActivityTest = new System.Windows.Forms.Button(); + this.btnCustomEmoticon = new System.Windows.Forms.Button(); + this.btnInviteUsers = new System.Windows.Forms.Button(); + this.onlineUsersDropDown = new System.Windows.Forms.ContextMenuStrip(this.components); + this.btnSendFiles = new System.Windows.Forms.Button(); + this.displayUser = new System.Windows.Forms.PictureBox(); + this.richTextHistory = new MSNPSharpClient.RtfRichTextBox(); + this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); + this.dlgColor = new System.Windows.Forms.ColorDialog(); + this.openCustomEmoticonDialog = new System.Windows.Forms.OpenFileDialog(); + this.panel1.SuspendLayout(); + this.tsMessage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.displayOwner)).BeginInit(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.displayUser)).BeginInit(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(163)))), ((int)(((byte)(163)))), ((int)(((byte)(186))))); + this.panel1.Controls.Add(this.tsMessage); + this.panel1.Controls.Add(this.displayOwner); + this.panel1.Controls.Add(this.inputTextBox); + this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel1.Location = new System.Drawing.Point(0, 272); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(663, 111); + this.panel1.TabIndex = 0; + // + // tsMessage + // + this.tsMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tsMessage.AutoSize = false; + this.tsMessage.Dock = System.Windows.Forms.DockStyle.None; + this.tsMessage.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.tsMessage.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.bMessageInsertEmoticon, + this.bMessageSendNudge, + this.tssMessageSeperator1, + this.bMessageFontColor, + this.bMessageBold, + this.bMessageItalic, + this.bMessageUnderline, + this.cbMessageFontName, + this.cbMessageFontSize, + this.tssMessageSeperator2, + this.bMessageSend}); + this.tsMessage.Location = new System.Drawing.Point(109, 3); + this.tsMessage.Name = "tsMessage"; + this.tsMessage.Padding = new System.Windows.Forms.Padding(3, 0, 1, 0); + this.tsMessage.Size = new System.Drawing.Size(550, 25); + this.tsMessage.TabIndex = 8; + // + // bMessageInsertEmoticon + // + this.bMessageInsertEmoticon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.bMessageInsertEmoticon.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem1, + this.bigRinToolStripMenuItem, + this.sadToolStripMenuItem, + this.winkToolStripMenuItem, + this.tongueOutToolStripMenuItem}); + this.bMessageInsertEmoticon.Image = global::MSNPSharpClient.Properties.Resources.smiley; + this.bMessageInsertEmoticon.ImageTransparentColor = System.Drawing.Color.Magenta; + this.bMessageInsertEmoticon.Name = "bMessageInsertEmoticon"; + this.bMessageInsertEmoticon.Size = new System.Drawing.Size(29, 22); + this.bMessageInsertEmoticon.Text = "toolStripDropDownButton1"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Image = global::MSNPSharpClient.Properties.Resources.smiley; + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem1.Text = "Simley"; + this.toolStripMenuItem1.ToolTipText = ":)"; + this.toolStripMenuItem1.Click += new System.EventHandler(this.emotionDropDown_Click); + // + // bigRinToolStripMenuItem + // + this.bigRinToolStripMenuItem.Image = global::MSNPSharpClient.Properties.Resources.biggrin; + this.bigRinToolStripMenuItem.Name = "bigRinToolStripMenuItem"; + this.bigRinToolStripMenuItem.Size = new System.Drawing.Size(138, 22); + this.bigRinToolStripMenuItem.Text = "Big Grin"; + this.bigRinToolStripMenuItem.ToolTipText = ":d"; + this.bigRinToolStripMenuItem.Click += new System.EventHandler(this.emotionDropDown_Click); + // + // sadToolStripMenuItem + // + this.sadToolStripMenuItem.Image = global::MSNPSharpClient.Properties.Resources.sad; + this.sadToolStripMenuItem.Name = "sadToolStripMenuItem"; + this.sadToolStripMenuItem.Size = new System.Drawing.Size(138, 22); + this.sadToolStripMenuItem.Text = "Sad"; + this.sadToolStripMenuItem.ToolTipText = ":("; + this.sadToolStripMenuItem.Click += new System.EventHandler(this.emotionDropDown_Click); + // + // winkToolStripMenuItem + // + this.winkToolStripMenuItem.Image = global::MSNPSharpClient.Properties.Resources.wink; + this.winkToolStripMenuItem.Name = "winkToolStripMenuItem"; + this.winkToolStripMenuItem.Size = new System.Drawing.Size(138, 22); + this.winkToolStripMenuItem.Text = "Wink"; + this.winkToolStripMenuItem.ToolTipText = ";)"; + this.winkToolStripMenuItem.Click += new System.EventHandler(this.emotionDropDown_Click); + // + // tongueOutToolStripMenuItem + // + this.tongueOutToolStripMenuItem.Image = global::MSNPSharpClient.Properties.Resources.tongueout; + this.tongueOutToolStripMenuItem.Name = "tongueOutToolStripMenuItem"; + this.tongueOutToolStripMenuItem.Size = new System.Drawing.Size(138, 22); + this.tongueOutToolStripMenuItem.Text = "Tongue Out"; + this.tongueOutToolStripMenuItem.ToolTipText = ":p"; + this.tongueOutToolStripMenuItem.Click += new System.EventHandler(this.emotionDropDown_Click); + // + // bMessageSendNudge + // + this.bMessageSendNudge.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.bMessageSendNudge.Image = global::MSNPSharpClient.Properties.Resources.nudge; + this.bMessageSendNudge.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.bMessageSendNudge.ImageTransparentColor = System.Drawing.Color.Magenta; + this.bMessageSendNudge.Name = "bMessageSendNudge"; + this.bMessageSendNudge.Size = new System.Drawing.Size(28, 22); + this.bMessageSendNudge.Text = "Send a &nudge"; + this.bMessageSendNudge.Click += new System.EventHandler(this.bMessageSendNudge_Click); + // + // tssMessageSeperator1 + // + this.tssMessageSeperator1.Name = "tssMessageSeperator1"; + this.tssMessageSeperator1.Size = new System.Drawing.Size(6, 25); + // + // bMessageFontColor + // + this.bMessageFontColor.Image = global::MSNPSharpClient.Properties.Resources.Color_fontHS; + this.bMessageFontColor.ImageTransparentColor = System.Drawing.Color.Magenta; + this.bMessageFontColor.Name = "bMessageFontColor"; + this.bMessageFontColor.Size = new System.Drawing.Size(56, 22); + this.bMessageFontColor.Text = "Color"; + this.bMessageFontColor.Click += new System.EventHandler(this.bMessageFontColor_Click); + // + // bMessageBold + // + this.bMessageBold.CheckOnClick = true; + this.bMessageBold.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.bMessageBold.Font = new System.Drawing.Font("Times New Roman", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.bMessageBold.ImageTransparentColor = System.Drawing.Color.Magenta; + this.bMessageBold.Name = "bMessageBold"; + this.bMessageBold.Size = new System.Drawing.Size(23, 22); + this.bMessageBold.Text = "B"; + this.bMessageBold.ToolTipText = "Bold"; + this.bMessageBold.CheckedChanged += new System.EventHandler(this.bMessageBoldItalicUnderline_CheckedChanged); + // + // bMessageItalic + // + this.bMessageItalic.CheckOnClick = true; + this.bMessageItalic.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.bMessageItalic.Font = new System.Drawing.Font("Times New Roman", 9.75F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.bMessageItalic.ImageTransparentColor = System.Drawing.Color.Magenta; + this.bMessageItalic.Name = "bMessageItalic"; + this.bMessageItalic.Size = new System.Drawing.Size(23, 22); + this.bMessageItalic.Text = "I"; + this.bMessageItalic.ToolTipText = "Italic"; + this.bMessageItalic.CheckedChanged += new System.EventHandler(this.bMessageBoldItalicUnderline_CheckedChanged); + // + // bMessageUnderline + // + this.bMessageUnderline.CheckOnClick = true; + this.bMessageUnderline.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.bMessageUnderline.Font = new System.Drawing.Font("Times New Roman", 9.75F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.bMessageUnderline.ImageTransparentColor = System.Drawing.Color.Magenta; + this.bMessageUnderline.Name = "bMessageUnderline"; + this.bMessageUnderline.Size = new System.Drawing.Size(23, 22); + this.bMessageUnderline.Text = "U"; + this.bMessageUnderline.ToolTipText = "Underline"; + this.bMessageUnderline.CheckedChanged += new System.EventHandler(this.bMessageBoldItalicUnderline_CheckedChanged); + // + // cbMessageFontName + // + this.cbMessageFontName.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; + this.cbMessageFontName.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.cbMessageFontName.DropDownWidth = 200; + this.cbMessageFontName.MaxDropDownItems = 12; + this.cbMessageFontName.Name = "cbMessageFontName"; + this.cbMessageFontName.Size = new System.Drawing.Size(140, 25); + this.cbMessageFontName.ToolTipText = "Font Name"; + this.cbMessageFontName.SelectedIndexChanged += new System.EventHandler(this.cbMessageFontName_SelectedIndexChanged); + this.cbMessageFontName.Validating += new System.ComponentModel.CancelEventHandler(this.cbMessageFontName_Validating); + this.cbMessageFontName.Validated += new System.EventHandler(this.cbMessageFontName_Validated); + // + // cbMessageFontSize + // + this.cbMessageFontSize.Items.AddRange(new object[] { + "8", + "9", + "10", + "11", + "12", + "14", + "16", + "18", + "20", + "22", + "24", + "26", + "28", + "36", + "48", + "72"}); + this.cbMessageFontSize.MaxDropDownItems = 12; + this.cbMessageFontSize.Name = "cbMessageFontSize"; + this.cbMessageFontSize.Size = new System.Drawing.Size(75, 25); + this.cbMessageFontSize.ToolTipText = "Font Size"; + this.cbMessageFontSize.SelectedIndexChanged += new System.EventHandler(this.cbMessageFontSize_SelectedIndexChanged); + this.cbMessageFontSize.Validating += new System.ComponentModel.CancelEventHandler(this.cbMessageFontSize_Validating); + this.cbMessageFontSize.Validated += new System.EventHandler(this.cbMessageFontSize_Validated); + // + // tssMessageSeperator2 + // + this.tssMessageSeperator2.Name = "tssMessageSeperator2"; + this.tssMessageSeperator2.Size = new System.Drawing.Size(6, 25); + // + // bMessageSend + // + this.bMessageSend.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.bMessageSend.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.bMessageSend.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); + this.bMessageSend.ImageTransparentColor = System.Drawing.Color.Magenta; + this.bMessageSend.Name = "bMessageSend"; + this.bMessageSend.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; + this.bMessageSend.Size = new System.Drawing.Size(57, 22); + this.bMessageSend.Text = " &Send "; + this.bMessageSend.Click += new System.EventHandler(this.bMessageSend_Click); + // + // displayOwner + // + this.displayOwner.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.displayOwner.BackColor = System.Drawing.Color.White; + this.displayOwner.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.displayOwner.Location = new System.Drawing.Point(3, 3); + this.displayOwner.Name = "displayOwner"; + this.displayOwner.Size = new System.Drawing.Size(100, 100); + this.displayOwner.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.displayOwner.TabIndex = 0; + this.displayOwner.TabStop = false; + // + // inputTextBox + // + this.inputTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.inputTextBox.Location = new System.Drawing.Point(109, 31); + this.inputTextBox.Multiline = true; + this.inputTextBox.Name = "inputTextBox"; + this.inputTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.inputTextBox.Size = new System.Drawing.Size(550, 72); + this.inputTextBox.TabIndex = 1; + this.inputTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.inputTextBox_KeyDown); + this.inputTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.inputTextBox_KeyPress); + // + // panel2 + // + this.panel2.Controls.Add(this.btnActivityTest); + this.panel2.Controls.Add(this.btnCustomEmoticon); + this.panel2.Controls.Add(this.btnInviteUsers); + this.panel2.Controls.Add(this.btnSendFiles); + this.panel2.Controls.Add(this.displayUser); + this.panel2.Controls.Add(this.richTextHistory); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 0); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(663, 272); + this.panel2.TabIndex = 0; + // + // btnActivityTest + // + this.btnActivityTest.Location = new System.Drawing.Point(3, 98); + this.btnActivityTest.Name = "btnActivityTest"; + this.btnActivityTest.Size = new System.Drawing.Size(100, 24); + this.btnActivityTest.TabIndex = 4; + this.btnActivityTest.Text = "Activity Test"; + this.btnActivityTest.UseVisualStyleBackColor = true; + this.btnActivityTest.Click += new System.EventHandler(this.btnActivityTest_Click); + // + // btnCustomEmoticon + // + this.btnCustomEmoticon.Location = new System.Drawing.Point(3, 41); + this.btnCustomEmoticon.Name = "btnCustomEmoticon"; + this.btnCustomEmoticon.Size = new System.Drawing.Size(100, 23); + this.btnCustomEmoticon.TabIndex = 3; + this.btnCustomEmoticon.Text = "Custom Emoticon"; + this.btnCustomEmoticon.UseVisualStyleBackColor = true; + this.btnCustomEmoticon.Click += new System.EventHandler(this.bMessageSendCustomEmoticon_Click); + // + // btnInviteUsers + // + this.btnInviteUsers.ContextMenuStrip = this.onlineUsersDropDown; + this.btnInviteUsers.Location = new System.Drawing.Point(3, 70); + this.btnInviteUsers.Name = "btnInviteUsers"; + this.btnInviteUsers.Size = new System.Drawing.Size(100, 23); + this.btnInviteUsers.TabIndex = 2; + this.btnInviteUsers.Text = "Invite Users"; + this.btnInviteUsers.UseVisualStyleBackColor = true; + this.btnInviteUsers.Click += new System.EventHandler(this.btnInviteUsers_Click); + // + // onlineUsersDropDown + // + this.onlineUsersDropDown.Name = "onlineUsersDropDown"; + this.onlineUsersDropDown.Size = new System.Drawing.Size(61, 4); + // + // btnSendFiles + // + this.btnSendFiles.Location = new System.Drawing.Point(3, 12); + this.btnSendFiles.Name = "btnSendFiles"; + this.btnSendFiles.Size = new System.Drawing.Size(100, 23); + this.btnSendFiles.TabIndex = 1; + this.btnSendFiles.Text = "Send Files"; + this.btnSendFiles.UseVisualStyleBackColor = true; + this.btnSendFiles.Click += new System.EventHandler(this.bMessageSendFiles_Click); + // + // displayUser + // + this.displayUser.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.displayUser.BackColor = System.Drawing.Color.White; + this.displayUser.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.displayUser.Location = new System.Drawing.Point(3, 166); + this.displayUser.Name = "displayUser"; + this.displayUser.Size = new System.Drawing.Size(100, 101); + this.displayUser.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.displayUser.TabIndex = 0; + this.displayUser.TabStop = false; + // + // richTextHistory + // + this.richTextHistory.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.richTextHistory.BackColor = System.Drawing.Color.Snow; + this.richTextHistory.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextHistory.HiglightColor = MSNPSharpClient.RtfRichTextBox.RtfColor.White; + this.richTextHistory.Location = new System.Drawing.Point(109, 3); + this.richTextHistory.Name = "richTextHistory"; + this.richTextHistory.ReadOnly = true; + this.richTextHistory.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.richTextHistory.Size = new System.Drawing.Size(554, 264); + this.richTextHistory.TabIndex = 0; + this.richTextHistory.TabStop = false; + this.richTextHistory.Text = ""; + this.richTextHistory.TextColor = MSNPSharpClient.RtfRichTextBox.RtfColor.Black; + // + // openFileDialog + // + this.openFileDialog.Multiselect = true; + // + // openCustomEmoticonDialog + // + this.openCustomEmoticonDialog.Filter = "Image File (*.png, *.jpg, *.bmp, *.gif|*.png;*.jpg;*.bmp;*.gif"; + this.openCustomEmoticonDialog.Title = "Open Image to transfer as an custom emoticon"; + // + // ConversationForm + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(663, 383); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.Name = "ConversationForm"; + this.Text = "Conversation - MSNPSharp"; + this.Load += new System.EventHandler(this.ConversationForm_Load); + this.Shown += new System.EventHandler(this.ConversationForm_Shown); + this.Closing += new System.ComponentModel.CancelEventHandler(this.ConversationForm_Closing); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.tsMessage.ResumeLayout(false); + this.tsMessage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.displayOwner)).EndInit(); + this.panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.displayUser)).EndInit(); + this.ResumeLayout(false); + + } + #endregion + + private Messenger _messenger = null; + private ConversationID activeconversationID = null; + + bool isYIM = false; + + + public ConversationID ConversationID + { + get + { + return activeconversationID; + } + + private set + { + activeconversationID = value; + } + } + + protected ConversationForm() + { + } + + /// + /// For sending and receiving YIM messages. + /// + /// + /// + public ConversationForm(Messenger messenger, Contact contact, ConversationID convId) + { + InitializeComponent(); + + _messenger = messenger; + activeconversationID = convId; + + isYIM = (ConversationID.NetworkType == ClientType.EmailMember); + + if (isYIM) + { + btnActivityTest.Enabled = false; + btnCustomEmoticon.Enabled = false; + btnInviteUsers.Enabled = false; + btnSendFiles.Enabled = false; + } + } + + public void OnMessageReceived(object sender, MessageArrivedEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OnMessageReceived), new object[] { sender, e }); + } + else + { + switch (e.MessageType) + { + case NetworkMessageType.Nudge: + MakeVisible(sender, e); + PrintNudge(e.Sender); + break; + case NetworkMessageType.Text: + MakeVisible(sender, e); + PrintText(e.Sender, (e as TextMessageArrivedEventArgs).TextMessage); + break; + case NetworkMessageType.Emoticon: + { + Emoticon emo = (e as EmoticonArrivedEventArgs).Emoticon; + if (emo != null) + { + MemoryStream ms = new MemoryStream(); + byte[] byt = new byte[emo.OpenStream().Length]; + emo.OpenStream().Seek(0, SeekOrigin.Begin); + emo.OpenStream().Read(byt, 0, byt.Length); + ms.Write(byt, 0, byt.Length); + + richTextHistory.Emotions[emo.Shortcut] = new Bitmap(Image.FromStream(ms)); + + ms.Close(); + } + + while (richTextHistory.HasEmotion) + { + richTextHistory.InsertEmotion(); + } + } + break; + } + } + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + } + + + private void inputTextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) + { + if ((e.KeyCode == Keys.Return) && (e.Alt || e.Control || e.Shift)) + { + return; + } + + try + { + _messenger.MessageManager.SendTyping(ConversationID); + + } + catch (Exception) + { + } + + if (e.KeyCode == Keys.Return) + { + if (!inputTextBox.Text.Equals(String.Empty)) + { + bMessageSend.PerformClick(); + } + e.Handled = true; + } + + + } + + private void inputTextBox_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == '\x001b') + { + Close(); + } + else if ((e.KeyChar == '\r') && inputTextBox.Text.Equals(string.Empty)) + { + e.Handled = true; + } + } + + private void MakeVisible(object sender, EventArgs e) + { + Show(); + } + + private void PrintNudge(Contact sender) + { + DisplaySystemMessage(sender.Name + " has sent a nudge!"); + PerformNudge(); + } + + + public void DisplaySystemMessage(string systemMessage) + { + richTextHistory.SelectionColor = Color.Red; + richTextHistory.SelectionFont = new Font("Verdana", 8f, FontStyle.Bold); + richTextHistory.SelectionIndent = 30; + richTextHistory.AppendText("* " + systemMessage + " *"); + richTextHistory.SelectionColor = Color.Black; + richTextHistory.SelectionIndent = 0; + richTextHistory.SelectionFont = new Font("Verdana", 8f); + richTextHistory.AppendText(Environment.NewLine); + richTextHistory.ScrollToCaret(); + } + + + private void ConversationForm_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + ConversationID.RemoteOwner.DisplayImageChanged -= Contact_DisplayImageChanged; + ConversationID.RemoteOwner.DisplayImageContextChanged -= Contact_DisplayImageConextChanged; + _messenger.MessageManager.EndConversation(activeconversationID); + } + + private void PrintText(Contact c, TextMessage message) + { + richTextHistory.SelectionColor = Color.Navy; + richTextHistory.SelectionIndent = 0; + richTextHistory.AppendText("[" + DateTime.Now.ToLongTimeString() + "]" + " "); + richTextHistory.SelectionColor = c.Mail == _messenger.ContactList.Owner.Mail ? Color.Blue : Color.Black; + richTextHistory.AppendText(c.Name + " <" + c.Mail + ">" + Environment.NewLine); + richTextHistory.SelectionColor = message.Color; + richTextHistory.SelectionIndent = 10; + richTextHistory.AppendText(message.Text); + richTextHistory.AppendText(Environment.NewLine); + richTextHistory.ScrollToCaret(); + + while (richTextHistory.HasEmotion) + { + richTextHistory.InsertEmotion(); + } + } + + private Image CreateImageFromColor(Color color, Size buttonSize) + { + Bitmap bitmap = new Bitmap(buttonSize.Width, buttonSize.Height); + using (Graphics graphics = Graphics.FromImage(bitmap)) + { + graphics.Clear(color); + } + return bitmap; + } + + private void UpdateTextFonts() + { + FontStyle fontStyle = FontStyle.Regular; + + if (bMessageBold.Checked) + fontStyle |= FontStyle.Bold; + if (bMessageItalic.Checked) + fontStyle |= FontStyle.Italic; + if (bMessageUnderline.Checked) + fontStyle |= FontStyle.Underline; + + Single fontSize = Single.Parse(cbMessageFontSize.Text); + Font messageFont = null; + + CreateFont: + try + { + messageFont = new Font(cbMessageFontName.Text, fontSize, fontStyle, GraphicsUnit.Point); + } + catch (ArgumentException) + { + fontStyle++; + if (fontStyle <= (FontStyle.Strikeout | FontStyle.Underline | FontStyle.Italic | FontStyle.Bold)) + goto CreateFont; + } + + if (messageFont == null) + return; + + bMessageBold.Checked = (fontStyle & FontStyle.Bold) != FontStyle.Regular; + bMessageItalic.Checked = (fontStyle & FontStyle.Italic) != FontStyle.Regular; + bMessageUnderline.Checked = (fontStyle & FontStyle.Underline) != FontStyle.Regular; + + richTextHistory.Font = new Font(richTextHistory.Font.FontFamily, messageFont.Size); + inputTextBox.Font = messageFont; + } + + private void ConversationForm_Load(object sender, EventArgs e) + { + Text = "Conversation with " + ConversationID.RemoteOwner.Mail + " - MSNPSharp"; + Icon = (Icon)((ConversationID.RemoteOwner.ClientType == ClientType.PassportMember) ? Properties.Resources.msn_ico : Properties.Resources.yahoo_ico); + + if (_messenger.ContactList.Owner.DisplayImage.Image != null) + displayOwner.Image = _messenger.ContactList.Owner.DisplayImage.Image; + else + displayOwner.Image = DisplayImage.DefaultImage; + + lock (richTextHistory.Emotions) + { + richTextHistory.Emotions[":)"] = Properties.Resources.smiley; + richTextHistory.Emotions[":d"] = Properties.Resources.biggrin; + richTextHistory.Emotions[":("] = Properties.Resources.sad; + richTextHistory.Emotions[";)"] = Properties.Resources.wink; + richTextHistory.Emotions[":p"] = Properties.Resources.tongueout; + } + + foreach (FontFamily ff in FontFamily.Families) + { + cbMessageFontName.Items.Add(ff.Name); + } + cbMessageFontName.Text = inputTextBox.Font.Name; + cbMessageFontSize.Text = inputTextBox.Font.Size.ToString(); + bMessageFontColor.Image = CreateImageFromColor(inputTextBox.ForeColor, inputTextBox.Size); + + cbMessageFontName.Tag = cbMessageFontName.Text; + cbMessageFontSize.Tag = cbMessageFontSize.Text; + + UpdateTextFonts(); + + inputTextBox.Select(); + } + + private void ConversationForm_Shown(object sender, EventArgs e) + { + if (!isYIM) + { + if (ConversationID.RemoteOwner.DisplayImage.Image != null) + displayUser.Image = ConversationID.RemoteOwner.DisplayImage.Image; + else + displayUser.Image = DisplayImage.DefaultImage; + } + else + displayUser.Image = Properties.Resources.YahooMessenger_logo.Clone() as Image; + + ConversationID.RemoteOwner.DisplayImageChanged += new EventHandler(Contact_DisplayImageChanged); + ConversationID.RemoteOwner.DisplayImageContextChanged += new EventHandler(Contact_DisplayImageConextChanged); + + // request the image, if not already available + if (ConversationID.RemoteOwner.Status != PresenceStatus.Offline) + { + if (ConversationID.RemoteOwner.DisplayImage != ConversationID.RemoteOwner.UserTileLocation) + { + try + { + RequestDisplayImage(ConversationID.RemoteOwner, null); + } + catch (Exception ex) + { + Trace.WriteLineIf(Settings.TraceSwitch.TraceError, ex.Message + "\r\n StackTrace: " + ex.StackTrace); + } + } + + + } + } + + private void RequestDisplayImage(Contact remoteContact, DisplayImage updateImage) + { + if (remoteContact.ClientType == ClientType.PassportMember && + updateImage != remoteContact.UserTileLocation) + { + if (updateImage == null) + updateImage = remoteContact.DisplayImage; + + // by sending an invitation a P2PTransferSession is automatically created. + // the session object takes care of the actual data transfer to the remote client, + // in contrast to the msnslpHandler object, which only deals with the protocol chatting. + P2PTransferSession session = _messenger.RequestMsnObject(remoteContact, updateImage); + } + } + + private void Contact_DisplayImageConextChanged(object sender, DisplayImageChangedEventArgs e) + { + try + { + RequestDisplayImage(ConversationID.RemoteOwner, null); + } + catch (Exception ex) + { + Trace.WriteLineIf(Settings.TraceSwitch.TraceError, ex.Message + "\r\n StackTrace: " + ex.StackTrace); + } + } + + private void Contact_DisplayImageChanged(object sender, DisplayImageChangedEventArgs e) + { + if (displayUser.InvokeRequired) + { + Invoke(new EventHandler(Contact_DisplayImageChanged), new object[] { sender, e }); + } + else + { + displayUser.Image = e.NewDisplayImage.Image; + } + } + + private void emotionDropDown_Click(object sender, EventArgs args) + { + ToolStripItem item = (ToolStripItem)sender; + inputTextBox.AppendText(item.ToolTipText); + inputTextBox.Focus(); + } + + private void PerformNudge() + { + Stopwatch stopwatch = new Stopwatch(); + + Random rnd = new Random(); + int x = Left; + int y = Top; + + stopwatch.Start(); + while (stopwatch.ElapsedMilliseconds < 500) + { + Left = rnd.Next(Location.X - 5, Location.X + 5); + Top = rnd.Next(Location.Y - 1, Location.Y + 1); + + System.Threading.Thread.Sleep(10); + Application.DoEvents(); + } + stopwatch.Stop(); + + Left = x; + Top = y; + } + + private void bMessageSend_Click(object sender, EventArgs e) + { + if (inputTextBox.Text.Length == 0) + return; + + TextMessage message = new TextMessage(inputTextBox.Text); + message.Font = inputTextBox.Font.Name; + message.Color = inputTextBox.ForeColor; + + if (inputTextBox.Font.Bold) + message.Decorations |= TextDecorations.Bold; + if (inputTextBox.Font.Italic) + message.Decorations |= TextDecorations.Italic; + if (inputTextBox.Font.Underline) + message.Decorations |= TextDecorations.Underline; + + inputTextBox.Clear(); + inputTextBox.Focus(); + + + ConversationID = _messenger.MessageManager.SendTextMessage(ConversationID, message); + PrintText(_messenger.ContactList.Owner, message); + + + } + + private void btnInviteUsers_Click(object sender, EventArgs e) + { + int x = Location.X + 10 + btnInviteUsers.Width; + int y = Location.Y + 10 + btnInviteUsers.Height + 20; + + onlineUsersDropDown.Items.Clear(); + foreach (Contact c in _messenger.ContactList.Forward) + { + if (c.Online && c.ClientType == ClientType.PassportMember) + { + onlineUsersDropDown.Items.Add(c.Mail, null, onlineUsersDropDown_Click).ToolTipText = c.Mail; + } + } + + onlineUsersDropDown.Show(x, y); + onlineUsersDropDown.Focus(); + } + + private void onlineUsersDropDown_Click(object sender, EventArgs args) + { + ToolStripItem item = (ToolStripItem)sender; + if (_messenger.ContactList.HasContact(item.ToolTipText, ClientType.PassportMember)) + { + activeconversationID = _messenger.MessageManager.InviteContactToConversation(activeconversationID, _messenger.ContactList.GetContact(item.ToolTipText)); + } + else + { + DisplaySystemMessage("Cannot find PassportMember: " + item.ToolTipText); + } + } + + private void bMessageSendNudge_Click(object sender, EventArgs e) + { + try + { + ConversationID = _messenger.MessageManager.SendNudge(ConversationID); + DisplaySystemMessage("You send a nudge."); + PerformNudge(); + } + catch (Exception) + { + + DisplaySystemMessage("Remote contact not online."); + } + } + + private void bMessageSendFiles_Click(object sender, EventArgs e) + { + if (ConversationID.RemoteOwner.Online == false || ConversationID.RemoteOwner == null) + { + DisplaySystemMessage("All contacts are offline or this contact doesn't support receiving files."); + return; + } + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + + try + { + + foreach (string filename in openFileDialog.FileNames) + { + FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read); + P2PTransferSession session = _messenger.SendFile(ConversationID.RemoteOwner, filename, fileStream); + } + } + catch (MSNPSharpException ex) + { + MessageBox.Show(ex.Message); + } + + + + } + } + + private void bMessageSendCustomEmoticon_Click(object sender, EventArgs e) + { + if (openCustomEmoticonDialog.ShowDialog() != DialogResult.OK) + return; + + MemoryStream mem = new MemoryStream(); + Bitmap img = new Bitmap(Image.FromFile(openCustomEmoticonDialog.FileName)); + img.Save(mem, ImageFormat.Png); + Emoticon emotest = new Emoticon(_messenger.Owner.Mail, mem, Path.GetFileName(openCustomEmoticonDialog.FileName), Path.GetFileName(openCustomEmoticonDialog.FileName)); + MSNObjectCatalog.GetInstance().Add(emotest); + List emolist = new List(); + emolist.Add(emotest); + + if (!richTextHistory.Emotions.ContainsKey(emotest.Shortcut)) + { + richTextHistory.Emotions[emotest.Shortcut] = img; + } + + try + { + ConversationID = _messenger.MessageManager.SendEmoticonDefinitions(ConversationID, emolist, EmoticonType.StaticEmoticon); + TextMessage emotxt = new TextMessage("Hey, this is a custom emoticon: " + emotest.Shortcut); + ConversationID = _messenger.MessageManager.SendTextMessage(ConversationID, emotxt); + DisplaySystemMessage("You send a custom emoticon with text message: Hey, this is a custom emoticon: [" + emotest.Shortcut + "]."); + } + catch (Exception) + { + if (!isYIM) + DisplaySystemMessage("Remote contact not online, emoticon will not be sent."); + } + } + + private void bMessageBoldItalicUnderline_CheckedChanged(object sender, EventArgs e) + { + UpdateTextFonts(); + inputTextBox.Select(); + } + + private void bMessageFontColor_Click(object sender, EventArgs e) + { + if (dlgColor.ShowDialog() == DialogResult.OK) + { + bMessageFontColor.Image = CreateImageFromColor(dlgColor.Color, bMessageFontColor.Image.Size); + inputTextBox.ForeColor = dlgColor.Color; + } + } + + private void cbMessageFontName_SelectedIndexChanged(object sender, EventArgs e) + { + Validate(); + } + + private void cbMessageFontName_Validated(object sender, EventArgs e) + { + cbMessageFontName.Tag = cbMessageFontName.Text; + UpdateTextFonts(); + inputTextBox.Select(); + } + + private void cbMessageFontName_Validating(object sender, CancelEventArgs e) + { + if (cbMessageFontName.FindStringExact(cbMessageFontName.Text) == -1 && cbMessageFontName.Tag != null) + { + cbMessageFontName.Text = cbMessageFontName.Tag.ToString(); + } + + } + + private void cbMessageFontSize_SelectedIndexChanged(object sender, EventArgs e) + { + Validate(); + } + + private void cbMessageFontSize_Validated(object sender, EventArgs e) + { + cbMessageFontSize.Tag = cbMessageFontSize.Text; + UpdateTextFonts(); + inputTextBox.Select(); + } + + private void cbMessageFontSize_Validating(object sender, CancelEventArgs e) + { + float fontSize = float.MinValue; + float.TryParse(cbMessageFontSize.Text, out fontSize); + + if (fontSize < 8f || fontSize > 72f && cbMessageFontSize.Tag != null) + { + cbMessageFontSize.Text = cbMessageFontSize.Tag.ToString(); + } + } + + private void MSNSLPHandler_TransferSessionClosed(object sender, P2PTransferSessionEventArgs e) + { + if (!richTextHistory.InvokeRequired) + { + DisplaySystemMessage("Activity session closed."); + } + else + { + richTextHistory.Invoke(new EventHandler(MSNSLPHandler_TransferSessionClosed), new object[] { sender,e }); + } + } + + private void btnActivityTest_Click(object sender, EventArgs e) + { + String activityID = "7"; //"20521364"; //The activityID of Music Mix activity. + String activityName = "Activity Test"; //Th name of acticvity + MSNSLPHandler msnslpHandler = _messenger.GetMSNSLPHandler(ConversationID.RemoteOwner); + P2PTransferSession session = msnslpHandler.SendInvitation(_messenger.ContactList.Owner, ConversationID.RemoteOwner, activityID, activityName, @"http://code.google.com/p/msnp-sharp"); + + msnslpHandler.TransferSessionClosed += delegate(object s, P2PTransferSessionEventArgs ea) + { + if (ea.TransferSession == session) + MSNSLPHandler_TransferSessionClosed(s, ea); + }; + } + } +}; diff --git a/Example/ConversationForm.resx b/Example/ConversationForm.resx new file mode 100644 index 0000000..67504b6 --- /dev/null +++ b/Example/ConversationForm.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 274, 14 + + + 397, 18 + + + 17, 17 + + + 158, 20 + + + 17, 57 + + \ No newline at end of file diff --git a/Example/DotMSNClient.Designer.cs b/Example/DotMSNClient.Designer.cs new file mode 100644 index 0000000..00d27e7 --- /dev/null +++ b/Example/DotMSNClient.Designer.cs @@ -0,0 +1,876 @@ +using System.Windows.Forms; + +namespace MSNPSharpClient +{ + partial class ClientForm + { + /// + /// 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() + { + this.components = new System.ComponentModel.Container(); + this.ImageList1 = new System.Windows.Forms.ImageList(this.components); + this.userMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.sendIMMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sendOIMMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sendMIMMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator(); + this.importContactsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createCircleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.blockMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.unblockMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); + this.openImageDialog = new System.Windows.Forms.OpenFileDialog(); + this.tmrKeepOnLine = new System.Windows.Forms.Timer(this.components); + this.tmrNews = new System.Windows.Forms.Timer(this.components); + this.sortContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripSortByStatus = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSortBygroup = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripDeleteGroup = new System.Windows.Forms.ToolStripMenuItem(); + this.groupContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolTipChangePhoto = new System.Windows.Forms.ToolTip(this.components); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.WhatsUpPanel = new System.Windows.Forms.Panel(); + this.lblNewsLink = new System.Windows.Forms.LinkLabel(); + this.lblNews = new System.Windows.Forms.Label(); + this.pbNewsPicture = new System.Windows.Forms.PictureBox(); + this.cmdNext = new System.Windows.Forms.Button(); + this.cmdPrev = new System.Windows.Forms.Button(); + this.lblWhatsup = new System.Windows.Forms.Label(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.propertyGrid = new System.Windows.Forms.PropertyGrid(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.pnlTreeViewsContainer = new System.Windows.Forms.Panel(); + this.treeViewFilterList = new System.Windows.Forms.TreeView(); + this.treeViewFavoriteList = new System.Windows.Forms.TreeView(); + this.SortPanel = new System.Windows.Forms.Panel(); + this.txtSearch = new System.Windows.Forms.TextBox(); + this.btnAddNew = new System.Windows.Forms.Button(); + this.btnSortBy = new System.Windows.Forms.Button(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel5 = new System.Windows.Forms.TableLayoutPanel(); + this.displayImageBox = new System.Windows.Forms.PictureBox(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tableLayoutPanel6 = new System.Windows.Forms.TableLayoutPanel(); + this.pnlLogin = new System.Windows.Forms.Panel(); + this.pnlNameAndPM = new System.Windows.Forms.Panel(); + this.btnSetMusic = new System.Windows.Forms.Button(); + this.lblPM = new System.Windows.Forms.TextBox(); + this.lblName = new System.Windows.Forms.TextBox(); + this.cbRobotMode = new System.Windows.Forms.CheckBox(); + this.accountTextBox = new System.Windows.Forms.TextBox(); + this.loginButton = new System.Windows.Forms.Button(); + this.passwordTextBox = new System.Windows.Forms.TextBox(); + this.tableLayoutPanel7 = new System.Windows.Forms.TableLayoutPanel(); + this.comboPlaces = new System.Windows.Forms.ComboBox(); + this.comboStatus = new System.Windows.Forms.ComboBox(); + this.statusBar = new System.Windows.Forms.Label(); + this.userMenuStrip.SuspendLayout(); + this.sortContextMenu.SuspendLayout(); + this.groupContextMenu.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.WhatsUpPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pbNewsPicture)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); + this.pnlTreeViewsContainer.SuspendLayout(); + this.SortPanel.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + this.tableLayoutPanel4.SuspendLayout(); + this.tableLayoutPanel5.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.displayImageBox)).BeginInit(); + this.panel1.SuspendLayout(); + this.tableLayoutPanel6.SuspendLayout(); + this.pnlLogin.SuspendLayout(); + this.pnlNameAndPM.SuspendLayout(); + this.tableLayoutPanel7.SuspendLayout(); + this.SuspendLayout(); + // + // ImageList1 + // + this.ImageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.ImageList1.ImageSize = new System.Drawing.Size(10, 10); + this.ImageList1.TransparentColor = System.Drawing.Color.Transparent; + // + // userMenuStrip + // + this.userMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.sendIMMenuItem, + this.sendOIMMenuItem, + this.sendMIMMenuItem, + this.toolStripMenuItem3, + this.importContactsMenuItem, + this.createCircleMenuItem, + this.toolStripMenuItem2, + this.blockMenuItem, + this.unblockMenuItem, + this.deleteMenuItem}); + this.userMenuStrip.Name = "contextMenuStrip1"; + this.userMenuStrip.Size = new System.Drawing.Size(201, 192); + // + // sendIMMenuItem + // + this.sendIMMenuItem.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold); + this.sendIMMenuItem.Name = "sendIMMenuItem"; + this.sendIMMenuItem.Size = new System.Drawing.Size(200, 22); + this.sendIMMenuItem.Text = "Send Instant Message"; + this.sendIMMenuItem.Click += new System.EventHandler(this.sendMessageToolStripMenuItem_Click); + // + // sendOIMMenuItem + // + this.sendOIMMenuItem.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold); + this.sendOIMMenuItem.Name = "sendOIMMenuItem"; + this.sendOIMMenuItem.Size = new System.Drawing.Size(200, 22); + this.sendOIMMenuItem.Text = "Send Offline Message"; + this.sendOIMMenuItem.Click += new System.EventHandler(this.sendOfflineMessageToolStripMenuItem_Click); + // + // sendMIMMenuItem + // + this.sendMIMMenuItem.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold); + this.sendMIMMenuItem.Name = "sendMIMMenuItem"; + this.sendMIMMenuItem.Size = new System.Drawing.Size(200, 22); + this.sendMIMMenuItem.Text = "Send Mobile Message"; + this.sendMIMMenuItem.Click += new System.EventHandler(this.sendMIMMenuItem_Click); + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(197, 6); + // + // importContactsMenuItem + // + this.importContactsMenuItem.Name = "importContactsMenuItem"; + this.importContactsMenuItem.Size = new System.Drawing.Size(200, 22); + this.importContactsMenuItem.Text = "Import Contacts"; + this.importContactsMenuItem.Click += new System.EventHandler(this.importContactsMenuItem_Click); + // + // createCircleMenuItem + // + this.createCircleMenuItem.Name = "createCircleMenuItem"; + this.createCircleMenuItem.Size = new System.Drawing.Size(200, 22); + this.createCircleMenuItem.Text = "Circle Tests"; + this.createCircleMenuItem.Click += new System.EventHandler(this.createCircleMenuItem_Click); + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(197, 6); + // + // blockMenuItem + // + this.blockMenuItem.Name = "blockMenuItem"; + this.blockMenuItem.Size = new System.Drawing.Size(200, 22); + this.blockMenuItem.Text = "Block"; + this.blockMenuItem.Click += new System.EventHandler(this.blockToolStripMenuItem_Click); + // + // unblockMenuItem + // + this.unblockMenuItem.Name = "unblockMenuItem"; + this.unblockMenuItem.Size = new System.Drawing.Size(200, 22); + this.unblockMenuItem.Text = "Unblock"; + this.unblockMenuItem.Click += new System.EventHandler(this.unblockMenuItem_Click); + // + // deleteMenuItem + // + this.deleteMenuItem.Name = "deleteMenuItem"; + this.deleteMenuItem.Size = new System.Drawing.Size(200, 22); + this.deleteMenuItem.Text = "Delete"; + this.deleteMenuItem.Click += new System.EventHandler(this.deleteMenuItem_Click); + // + // openFileDialog + // + this.openFileDialog.Multiselect = true; + // + // openImageDialog + // + this.openImageDialog.Filter = "Supported Images|*.png;*.jpg;*.jpeg;*.gif"; + this.openImageDialog.Multiselect = true; + this.openImageDialog.Title = "Select display image"; + // + // tmrKeepOnLine + // + this.tmrKeepOnLine.Interval = 1000; + // + // tmrNews + // + this.tmrNews.Interval = 5000; + this.tmrNews.Tick += new System.EventHandler(this.tmrNews_Tick); + // + // sortContextMenu + // + this.sortContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripSortByStatus, + this.toolStripSortBygroup}); + this.sortContextMenu.Name = "sortContextMenu"; + this.sortContextMenu.ShowCheckMargin = true; + this.sortContextMenu.ShowImageMargin = false; + this.sortContextMenu.Size = new System.Drawing.Size(140, 48); + // + // toolStripSortByStatus + // + this.toolStripSortByStatus.Checked = true; + this.toolStripSortByStatus.CheckOnClick = true; + this.toolStripSortByStatus.CheckState = System.Windows.Forms.CheckState.Checked; + this.toolStripSortByStatus.Name = "toolStripSortByStatus"; + this.toolStripSortByStatus.ShowShortcutKeys = false; + this.toolStripSortByStatus.Size = new System.Drawing.Size(139, 22); + this.toolStripSortByStatus.Text = "Sort by status"; + this.toolStripSortByStatus.Click += new System.EventHandler(this.toolStripSortByStatus_Click); + // + // toolStripSortBygroup + // + this.toolStripSortBygroup.CheckOnClick = true; + this.toolStripSortBygroup.Name = "toolStripSortBygroup"; + this.toolStripSortBygroup.ShowShortcutKeys = false; + this.toolStripSortBygroup.Size = new System.Drawing.Size(139, 22); + this.toolStripSortBygroup.Text = "Sort by group"; + this.toolStripSortBygroup.Click += new System.EventHandler(this.toolStripSortBygroup_Click); + // + // toolStripDeleteGroup + // + this.toolStripDeleteGroup.Name = "toolStripDeleteGroup"; + this.toolStripDeleteGroup.Size = new System.Drawing.Size(142, 22); + this.toolStripDeleteGroup.Text = "Delete group"; + this.toolStripDeleteGroup.Click += new System.EventHandler(this.toolStripDeleteGroup_Click); + // + // groupContextMenu + // + this.groupContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripDeleteGroup}); + this.groupContextMenu.Name = "sortContextMenu"; + this.groupContextMenu.ShowCheckMargin = true; + this.groupContextMenu.ShowImageMargin = false; + this.groupContextMenu.Size = new System.Drawing.Size(143, 26); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Controls.Add(this.WhatsUpPanel, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.splitContainer1, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel3, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.statusBar, 0, 3); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 128F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 57F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(643, 634); + this.tableLayoutPanel1.TabIndex = 3; + // + // WhatsUpPanel + // + this.WhatsUpPanel.BackColor = System.Drawing.Color.White; + this.WhatsUpPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.WhatsUpPanel.Controls.Add(this.lblNewsLink); + this.WhatsUpPanel.Controls.Add(this.lblNews); + this.WhatsUpPanel.Controls.Add(this.pbNewsPicture); + this.WhatsUpPanel.Controls.Add(this.cmdNext); + this.WhatsUpPanel.Controls.Add(this.cmdPrev); + this.WhatsUpPanel.Controls.Add(this.lblWhatsup); + this.WhatsUpPanel.Dock = System.Windows.Forms.DockStyle.Bottom; + this.WhatsUpPanel.Location = new System.Drawing.Point(3, 551); + this.WhatsUpPanel.Name = "WhatsUpPanel"; + this.WhatsUpPanel.Size = new System.Drawing.Size(637, 50); + this.WhatsUpPanel.TabIndex = 8; + // + // lblNewsLink + // + this.lblNewsLink.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.lblNewsLink.Location = new System.Drawing.Point(506, 25); + this.lblNewsLink.Name = "lblNewsLink"; + this.lblNewsLink.Size = new System.Drawing.Size(69, 21); + this.lblNewsLink.TabIndex = 5; + this.lblNewsLink.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lblNewsLink.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lblNewsLink_LinkClicked); + // + // lblNews + // + this.lblNews.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblNews.AutoEllipsis = true; + this.lblNews.BackColor = System.Drawing.Color.Transparent; + this.lblNews.Location = new System.Drawing.Point(97, 3); + this.lblNews.Name = "lblNews"; + this.lblNews.Size = new System.Drawing.Size(402, 42); + this.lblNews.TabIndex = 4; + this.lblNews.Text = " *"; + this.lblNews.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // pbNewsPicture + // + this.pbNewsPicture.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.pbNewsPicture.BackColor = System.Drawing.Color.Transparent; + this.pbNewsPicture.Cursor = System.Windows.Forms.Cursors.Hand; + this.pbNewsPicture.Location = new System.Drawing.Point(589, 1); + this.pbNewsPicture.Name = "pbNewsPicture"; + this.pbNewsPicture.Size = new System.Drawing.Size(45, 45); + this.pbNewsPicture.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pbNewsPicture.TabIndex = 3; + this.pbNewsPicture.TabStop = false; + // + // cmdNext + // + this.cmdNext.Location = new System.Drawing.Point(42, 22); + this.cmdNext.Name = "cmdNext"; + this.cmdNext.Size = new System.Drawing.Size(22, 22); + this.cmdNext.TabIndex = 2; + this.cmdNext.Text = ">"; + this.cmdNext.UseVisualStyleBackColor = true; + this.cmdNext.Click += new System.EventHandler(this.cmdNext_Click); + // + // cmdPrev + // + this.cmdPrev.Location = new System.Drawing.Point(15, 22); + this.cmdPrev.Name = "cmdPrev"; + this.cmdPrev.Size = new System.Drawing.Size(22, 22); + this.cmdPrev.TabIndex = 1; + this.cmdPrev.Text = "<"; + this.cmdPrev.UseVisualStyleBackColor = true; + this.cmdPrev.Click += new System.EventHandler(this.cmdPrev_Click); + // + // lblWhatsup + // + this.lblWhatsup.AutoSize = true; + this.lblWhatsup.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(162))); + this.lblWhatsup.Location = new System.Drawing.Point(11, 3); + this.lblWhatsup.Name = "lblWhatsup"; + this.lblWhatsup.Size = new System.Drawing.Size(66, 13); + this.lblWhatsup.TabIndex = 0; + this.lblWhatsup.Text = "What\'s Up"; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(3, 131); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.BackColor = System.Drawing.Color.White; + this.splitContainer1.Panel1.Controls.Add(this.propertyGrid); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.tableLayoutPanel2); + this.splitContainer1.Size = new System.Drawing.Size(637, 413); + this.splitContainer1.SplitterDistance = 252; + this.splitContainer1.TabIndex = 0; + // + // propertyGrid + // + this.propertyGrid.BackColor = System.Drawing.Color.White; + this.propertyGrid.CommandsBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(128))))); + this.propertyGrid.Dock = System.Windows.Forms.DockStyle.Fill; + this.propertyGrid.HelpBackColor = System.Drawing.Color.White; + this.propertyGrid.LineColor = System.Drawing.SystemColors.ScrollBar; + this.propertyGrid.Location = new System.Drawing.Point(0, 0); + this.propertyGrid.Name = "propertyGrid"; + this.propertyGrid.Size = new System.Drawing.Size(252, 413); + this.propertyGrid.TabIndex = 5; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.ColumnCount = 1; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel2.Controls.Add(this.pnlTreeViewsContainer, 0, 1); + this.tableLayoutPanel2.Controls.Add(this.SortPanel, 0, 0); + this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(1); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 2; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(381, 413); + this.tableLayoutPanel2.TabIndex = 0; + // + // pnlTreeViewsContainer + // + this.pnlTreeViewsContainer.Controls.Add(this.treeViewFilterList); + this.pnlTreeViewsContainer.Controls.Add(this.treeViewFavoriteList); + this.pnlTreeViewsContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlTreeViewsContainer.Location = new System.Drawing.Point(3, 32); + this.pnlTreeViewsContainer.Name = "pnlTreeViewsContainer"; + this.pnlTreeViewsContainer.Size = new System.Drawing.Size(375, 378); + this.pnlTreeViewsContainer.TabIndex = 3; + // + // treeViewFilterList + // + this.treeViewFilterList.BackColor = System.Drawing.Color.White; + this.treeViewFilterList.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.treeViewFilterList.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeViewFilterList.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(162))); + this.treeViewFilterList.FullRowSelect = true; + this.treeViewFilterList.HideSelection = false; + this.treeViewFilterList.Indent = 20; + this.treeViewFilterList.ItemHeight = 20; + this.treeViewFilterList.Location = new System.Drawing.Point(0, 0); + this.treeViewFilterList.Name = "treeViewFilterList"; + this.treeViewFilterList.ShowLines = false; + this.treeViewFilterList.ShowPlusMinus = false; + this.treeViewFilterList.ShowRootLines = false; + this.treeViewFilterList.Size = new System.Drawing.Size(375, 378); + this.treeViewFilterList.TabIndex = 5; + this.treeViewFilterList.Visible = false; + this.treeViewFilterList.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseDoubleClick); + this.treeViewFilterList.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick); + // + // treeViewFavoriteList + // + this.treeViewFavoriteList.AllowDrop = true; + this.treeViewFavoriteList.BackColor = System.Drawing.Color.White; + this.treeViewFavoriteList.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.treeViewFavoriteList.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeViewFavoriteList.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(162))); + this.treeViewFavoriteList.FullRowSelect = true; + this.treeViewFavoriteList.HideSelection = false; + this.treeViewFavoriteList.ImageIndex = 0; + this.treeViewFavoriteList.ImageList = this.ImageList1; + this.treeViewFavoriteList.Indent = 15; + this.treeViewFavoriteList.ItemHeight = 20; + this.treeViewFavoriteList.Location = new System.Drawing.Point(0, 0); + this.treeViewFavoriteList.Name = "treeViewFavoriteList"; + this.treeViewFavoriteList.SelectedImageIndex = 0; + this.treeViewFavoriteList.ShowLines = false; + this.treeViewFavoriteList.ShowPlusMinus = false; + this.treeViewFavoriteList.ShowRootLines = false; + this.treeViewFavoriteList.Size = new System.Drawing.Size(375, 378); + this.treeViewFavoriteList.TabIndex = 4; + this.treeViewFavoriteList.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseDoubleClick); + this.treeViewFavoriteList.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeViewFavoriteList_DragDrop); + this.treeViewFavoriteList.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeViewFavoriteList_DragEnter); + this.treeViewFavoriteList.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick); + this.treeViewFavoriteList.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeViewFavoriteList_ItemDrag); + this.treeViewFavoriteList.DragOver += new System.Windows.Forms.DragEventHandler(this.treeViewFavoriteList_DragOver); + // + // SortPanel + // + this.SortPanel.BackColor = System.Drawing.Color.White; + this.SortPanel.Controls.Add(this.txtSearch); + this.SortPanel.Controls.Add(this.btnAddNew); + this.SortPanel.Controls.Add(this.btnSortBy); + this.SortPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.SortPanel.Location = new System.Drawing.Point(1, 1); + this.SortPanel.Margin = new System.Windows.Forms.Padding(1); + this.SortPanel.Name = "SortPanel"; + this.SortPanel.Size = new System.Drawing.Size(379, 27); + this.SortPanel.TabIndex = 2; + // + // txtSearch + // + this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSearch.ForeColor = System.Drawing.SystemColors.ScrollBar; + this.txtSearch.Location = new System.Drawing.Point(6, 4); + this.txtSearch.Name = "txtSearch"; + this.txtSearch.Size = new System.Drawing.Size(279, 21); + this.txtSearch.TabIndex = 9; + this.txtSearch.Text = "Search contacts"; + this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged); + this.txtSearch.Leave += new System.EventHandler(this.txtSearch_Leave); + this.txtSearch.Enter += new System.EventHandler(this.txtSearch_Enter); + // + // btnAddNew + // + this.btnAddNew.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.btnAddNew.BackColor = System.Drawing.SystemColors.Control; + this.btnAddNew.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(162))); + this.btnAddNew.Location = new System.Drawing.Point(334, 2); + this.btnAddNew.Name = "btnAddNew"; + this.btnAddNew.Size = new System.Drawing.Size(44, 22); + this.btnAddNew.TabIndex = 7; + this.btnAddNew.Text = "+"; + this.btnAddNew.UseVisualStyleBackColor = true; + this.btnAddNew.Click += new System.EventHandler(this.btnAddNew_Click); + // + // btnSortBy + // + this.btnSortBy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.btnSortBy.BackColor = System.Drawing.SystemColors.Control; + this.btnSortBy.Cursor = System.Windows.Forms.Cursors.Arrow; + this.btnSortBy.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(162))); + this.btnSortBy.Location = new System.Drawing.Point(290, 2); + this.btnSortBy.Name = "btnSortBy"; + this.btnSortBy.Size = new System.Drawing.Size(44, 22); + this.btnSortBy.TabIndex = 0; + this.btnSortBy.Text = "sort"; + this.btnSortBy.UseVisualStyleBackColor = true; + this.btnSortBy.Click += new System.EventHandler(this.btnSortBy_Click); + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.BackColor = System.Drawing.Color.White; + this.tableLayoutPanel3.BackgroundImage = global::MSNPSharpClient.Properties.Resources.app_banner; + this.tableLayoutPanel3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.tableLayoutPanel3.ColumnCount = 2; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 380F)); + this.tableLayoutPanel3.Controls.Add(this.tableLayoutPanel4, 1, 0); + this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel3.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 1; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(637, 122); + this.tableLayoutPanel3.TabIndex = 9; + // + // tableLayoutPanel4 + // + this.tableLayoutPanel4.ColumnCount = 1; + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel4.Controls.Add(this.tableLayoutPanel5, 0, 0); + this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel4.Location = new System.Drawing.Point(260, 3); + this.tableLayoutPanel4.Name = "tableLayoutPanel4"; + this.tableLayoutPanel4.RowCount = 1; + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 126F)); + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 126F)); + this.tableLayoutPanel4.Size = new System.Drawing.Size(374, 116); + this.tableLayoutPanel4.TabIndex = 0; + // + // tableLayoutPanel5 + // + this.tableLayoutPanel5.ColumnCount = 2; + this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 87F)); + this.tableLayoutPanel5.Controls.Add(this.displayImageBox, 1, 0); + this.tableLayoutPanel5.Controls.Add(this.panel1, 0, 0); + this.tableLayoutPanel5.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel5.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel5.Name = "tableLayoutPanel5"; + this.tableLayoutPanel5.RowCount = 1; + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 120F)); + this.tableLayoutPanel5.Size = new System.Drawing.Size(368, 120); + this.tableLayoutPanel5.TabIndex = 0; + // + // displayImageBox + // + this.displayImageBox.BackColor = System.Drawing.Color.White; + this.displayImageBox.Cursor = System.Windows.Forms.Cursors.Hand; + this.displayImageBox.Location = new System.Drawing.Point(284, 3); + this.displayImageBox.Name = "displayImageBox"; + this.displayImageBox.Size = new System.Drawing.Size(80, 80); + this.displayImageBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.displayImageBox.TabIndex = 3; + this.displayImageBox.TabStop = false; + this.displayImageBox.Click += new System.EventHandler(this.displayImageBox_Click); + // + // panel1 + // + this.panel1.Controls.Add(this.tableLayoutPanel6); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(3, 3); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(275, 114); + this.panel1.TabIndex = 4; + // + // tableLayoutPanel6 + // + this.tableLayoutPanel6.ColumnCount = 1; + this.tableLayoutPanel6.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel6.Controls.Add(this.pnlLogin, 0, 0); + this.tableLayoutPanel6.Controls.Add(this.tableLayoutPanel7, 0, 1); + this.tableLayoutPanel6.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel6.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel6.Name = "tableLayoutPanel6"; + this.tableLayoutPanel6.RowCount = 2; + this.tableLayoutPanel6.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel6.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F)); + this.tableLayoutPanel6.Size = new System.Drawing.Size(275, 114); + this.tableLayoutPanel6.TabIndex = 5; + // + // pnlLogin + // + this.pnlLogin.Controls.Add(this.pnlNameAndPM); + this.pnlLogin.Controls.Add(this.cbRobotMode); + this.pnlLogin.Controls.Add(this.accountTextBox); + this.pnlLogin.Controls.Add(this.loginButton); + this.pnlLogin.Controls.Add(this.passwordTextBox); + this.pnlLogin.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlLogin.Location = new System.Drawing.Point(3, 3); + this.pnlLogin.Name = "pnlLogin"; + this.pnlLogin.Size = new System.Drawing.Size(269, 73); + this.pnlLogin.TabIndex = 1; + // + // pnlNameAndPM + // + this.pnlNameAndPM.Controls.Add(this.btnSetMusic); + this.pnlNameAndPM.Controls.Add(this.lblPM); + this.pnlNameAndPM.Controls.Add(this.lblName); + this.pnlNameAndPM.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlNameAndPM.Location = new System.Drawing.Point(0, 0); + this.pnlNameAndPM.Name = "pnlNameAndPM"; + this.pnlNameAndPM.Size = new System.Drawing.Size(269, 73); + this.pnlNameAndPM.TabIndex = 15; + this.pnlNameAndPM.Visible = false; + // + // btnSetMusic + // + this.btnSetMusic.Location = new System.Drawing.Point(233, 25); + this.btnSetMusic.Name = "btnSetMusic"; + this.btnSetMusic.Size = new System.Drawing.Size(33, 22); + this.btnSetMusic.TabIndex = 8; + this.btnSetMusic.Tag = "0"; + this.btnSetMusic.Text = "M"; + this.btnSetMusic.UseVisualStyleBackColor = true; + this.btnSetMusic.Click += new System.EventHandler(this.btnSetMusic_Click); + // + // lblPM + // + this.lblPM.Location = new System.Drawing.Point(3, 26); + this.lblPM.Name = "lblPM"; + this.lblPM.Size = new System.Drawing.Size(228, 21); + this.lblPM.TabIndex = 7; + this.lblPM.Leave += new System.EventHandler(this.lblName_Leave); + // + // lblName + // + this.lblName.Location = new System.Drawing.Point(3, 1); + this.lblName.Name = "lblName"; + this.lblName.Size = new System.Drawing.Size(263, 21); + this.lblName.TabIndex = 6; + this.lblName.Leave += new System.EventHandler(this.lblName_Leave); + // + // cbRobotMode + // + this.cbRobotMode.AutoSize = true; + this.cbRobotMode.Location = new System.Drawing.Point(3, 54); + this.cbRobotMode.Name = "cbRobotMode"; + this.cbRobotMode.Size = new System.Drawing.Size(136, 19); + this.cbRobotMode.TabIndex = 11; + this.cbRobotMode.Text = "Provisioned Account"; + this.cbRobotMode.UseVisualStyleBackColor = true; + this.cbRobotMode.CheckedChanged += new System.EventHandler(this.cbRobotMode_CheckedChanged); + // + // accountTextBox + // + this.accountTextBox.Location = new System.Drawing.Point(3, 2); + this.accountTextBox.Name = "accountTextBox"; + this.accountTextBox.Size = new System.Drawing.Size(263, 21); + this.accountTextBox.TabIndex = 9; + this.accountTextBox.Text = "example@escargot.chat"; + this.accountTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.login_KeyPress); + // + // loginButton + // + this.loginButton.Location = new System.Drawing.Point(145, 50); + this.loginButton.Name = "loginButton"; + this.loginButton.Size = new System.Drawing.Size(121, 22); + this.loginButton.TabIndex = 8; + this.loginButton.Tag = "0"; + this.loginButton.Text = "> Sign in"; + this.loginButton.UseVisualStyleBackColor = true; + this.loginButton.Click += new System.EventHandler(this.loginButton_Click); + // + // passwordTextBox + // + this.passwordTextBox.Location = new System.Drawing.Point(3, 27); + this.passwordTextBox.Name = "passwordTextBox"; + this.passwordTextBox.PasswordChar = '*'; + this.passwordTextBox.Size = new System.Drawing.Size(263, 21); + this.passwordTextBox.TabIndex = 10; + this.passwordTextBox.Text = "sneakysource"; + this.passwordTextBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.login_KeyPress); + // + // tableLayoutPanel7 + // + this.tableLayoutPanel7.ColumnCount = 2; + this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel7.Controls.Add(this.comboPlaces, 0, 0); + this.tableLayoutPanel7.Controls.Add(this.comboStatus, 0, 0); + this.tableLayoutPanel7.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel7.Location = new System.Drawing.Point(3, 82); + this.tableLayoutPanel7.Name = "tableLayoutPanel7"; + this.tableLayoutPanel7.RowCount = 1; + this.tableLayoutPanel7.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel7.Size = new System.Drawing.Size(269, 29); + this.tableLayoutPanel7.TabIndex = 0; + // + // comboPlaces + // + this.comboPlaces.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboPlaces.DropDownWidth = 220; + this.comboPlaces.FormattingEnabled = true; + this.comboPlaces.Location = new System.Drawing.Point(137, 3); + this.comboPlaces.Name = "comboPlaces"; + this.comboPlaces.Size = new System.Drawing.Size(129, 23); + this.comboPlaces.TabIndex = 6; + this.comboPlaces.Visible = false; + this.comboPlaces.SelectedIndexChanged += new System.EventHandler(this.comboPlaces_SelectedIndexChanged); + // + // comboStatus + // + this.comboStatus.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.comboStatus.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboStatus.FormattingEnabled = true; + this.comboStatus.ItemHeight = 15; + this.comboStatus.Items.AddRange(new object[] { + "Online", + "Busy", + "Away", + "Hidden", + "Offline"}); + this.comboStatus.Location = new System.Drawing.Point(3, 3); + this.comboStatus.Name = "comboStatus"; + this.comboStatus.Size = new System.Drawing.Size(128, 21); + this.comboStatus.TabIndex = 5; + this.comboStatus.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboStatus_DrawItem); + this.comboStatus.SelectedIndexChanged += new System.EventHandler(this.comboStatus_SelectedIndexChanged); + this.comboStatus.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.comboStatus_KeyPress); + // + // statusBar + // + this.statusBar.AutoSize = true; + this.statusBar.Dock = System.Windows.Forms.DockStyle.Fill; + this.statusBar.Location = new System.Drawing.Point(3, 604); + this.statusBar.Name = "statusBar"; + this.statusBar.Size = new System.Drawing.Size(637, 30); + this.statusBar.TabIndex = 10; + this.statusBar.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // ClientForm + // + this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); + this.BackColor = System.Drawing.Color.White; + this.ClientSize = new System.Drawing.Size(643, 634); + this.Controls.Add(this.tableLayoutPanel1); + this.Font = new System.Drawing.Font("Arial", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MinimumSize = new System.Drawing.Size(640, 480); + this.Name = "ClientForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "MSNPSharp Example Client for Escargot"; + this.Load += new System.EventHandler(this.ClientForm_Load); + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ClientForm_FormClosing); + this.userMenuStrip.ResumeLayout(false); + this.sortContextMenu.ResumeLayout(false); + this.groupContextMenu.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.WhatsUpPanel.ResumeLayout(false); + this.WhatsUpPanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pbNewsPicture)).EndInit(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.tableLayoutPanel2.ResumeLayout(false); + this.pnlTreeViewsContainer.ResumeLayout(false); + this.SortPanel.ResumeLayout(false); + this.SortPanel.PerformLayout(); + this.tableLayoutPanel3.ResumeLayout(false); + this.tableLayoutPanel4.ResumeLayout(false); + this.tableLayoutPanel5.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.displayImageBox)).EndInit(); + this.panel1.ResumeLayout(false); + this.tableLayoutPanel6.ResumeLayout(false); + this.pnlLogin.ResumeLayout(false); + this.pnlLogin.PerformLayout(); + this.pnlNameAndPM.ResumeLayout(false); + this.pnlNameAndPM.PerformLayout(); + this.tableLayoutPanel7.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private OpenFileDialog openFileDialog; + private OpenFileDialog openImageDialog; + private System.Windows.Forms.Timer tmrKeepOnLine; + private System.Windows.Forms.Timer tmrNews; + private ImageList ImageList1; + private ContextMenuStrip userMenuStrip; + private ToolStripMenuItem sendIMMenuItem; + private ToolStripMenuItem blockMenuItem; + private ToolStripSeparator toolStripMenuItem2; + private ToolStripMenuItem unblockMenuItem; + private ToolStripMenuItem sendOIMMenuItem; + private ToolStripSeparator toolStripMenuItem3; + private ToolStripMenuItem sendMIMMenuItem; + private ContextMenuStrip sortContextMenu; + private ToolStripMenuItem toolStripSortByStatus; + private ToolStripMenuItem toolStripSortBygroup; + private ToolStripMenuItem toolStripDeleteGroup; + private ContextMenuStrip groupContextMenu; + private ToolStripMenuItem importContactsMenuItem; + private ToolStripMenuItem createCircleMenuItem; + private ToolStripMenuItem deleteMenuItem; + private ToolTip toolTipChangePhoto; + private TableLayoutPanel tableLayoutPanel1; + private Panel WhatsUpPanel; + private LinkLabel lblNewsLink; + private Label lblNews; + private PictureBox pbNewsPicture; + private Button cmdNext; + private Button cmdPrev; + private Label lblWhatsup; + private SplitContainer splitContainer1; + private PropertyGrid propertyGrid; + private TableLayoutPanel tableLayoutPanel2; + private Panel SortPanel; + private TextBox txtSearch; + private Button btnAddNew; + private Button btnSortBy; + private TableLayoutPanel tableLayoutPanel3; + private Panel pnlTreeViewsContainer; + private TreeView treeViewFavoriteList; + private Label statusBar; + private TreeView treeViewFilterList; + private TableLayoutPanel tableLayoutPanel4; + private TableLayoutPanel tableLayoutPanel5; + private Panel panel1; + private TableLayoutPanel tableLayoutPanel6; + private Panel pnlLogin; + private Panel pnlNameAndPM; + private Button btnSetMusic; + private TextBox lblPM; + private TextBox lblName; + private CheckBox cbRobotMode; + private TextBox accountTextBox; + private Button loginButton; + private TextBox passwordTextBox; + private TableLayoutPanel tableLayoutPanel7; + private ComboBox comboPlaces; + private ComboBox comboStatus; + private PictureBox displayImageBox; + + } +} diff --git a/Example/DotMSNClient.cs b/Example/DotMSNClient.cs new file mode 100644 index 0000000..f1299ee --- /dev/null +++ b/Example/DotMSNClient.cs @@ -0,0 +1,2343 @@ +using System; +using System.IO; +using System.Data; +using System.Drawing; +using System.Collections; +using System.Diagnostics; +using System.Windows.Forms; +using System.ComponentModel; +using System.Collections.Generic; +using System.Threading; +using System.Xml; + +namespace MSNPSharpClient +{ + using MSNPSharp; + using MSNPSharp.Core; + using MSNPSharp.DataTransfer; + using MSNPSharp.MSNWS.MSNABSharingService; + using MSNPSharp.Utilities; + + /// + /// MSNPSharp Client example. + /// + public partial class ClientForm : System.Windows.Forms.Form + { + // Create a Messenger object to use MSNPSharp. + private Messenger messenger = new Messenger(); + private List convforms = new List(0); + private TraceForm traceform = new TraceForm(); + + public List ConversationForms + { + get + { + return convforms; + } + } + + public Messenger Messenger + { + get + { + return messenger; + } + } + + public ClientForm() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + this.Icon = Properties.Resources.MSNPSharp_logo_small_ico; + + // You can set proxy settings here + // for example: messenger.ConnectivitySettings.ProxyHost = "10.0.0.2"; + + Settings.TraceSwitch.Level = System.Diagnostics.TraceLevel.Verbose; + + //Set the p2p invitation interval in the whole invitation request queue (in ms) + Schedulers.P2PInvitationScheduler.DelayTime = 5000; + Schedulers.SwitchBoardRequestScheduler.DelayTime = 1000; + + if (Settings.IsMono) //I am running on Mono. + { + // Don't enable this on mono, because mono raises NotImplementedException. + Settings.EnableGzipCompressionForWebServices = false; + } + +#if DEBUG + + //How to save your personal addressbook. + //If you want your addressbook have a better reading/writting performance, use MclSerialization.None + //In this case, your addressbook will be save as a xml file, everyone can read it. + //If you want your addressbook has a smaller size, use MclSerialization.Compression. + //In this case, your addressbook file will be save in gzip format, none can read it, but the performance is not so good. + Settings.SerializationType = MSNPSharp.IO.MclSerialization.None; +#elif TRACE + Settings.SerializationType = MSNPSharp.IO.MclSerialization.Compression | MSNPSharp.IO.MclSerialization.Cryptography; +#endif + + // The following line is very IMPOTANT. + // Keep the messenger sending PNG to the server in a proper frequency, or it will be kicked offline. + this.tmrKeepOnLine.Tick += new EventHandler(tmrKeepOnLine_Tick); + + // If you want to use it in an environment that does not have write permission, set NoSave to true. + //Settings.NoSave = true; + + // set the events that we will handle + // remember that the nameserver is the server that sends contact lists, notifies you of contact status changes, etc. + // a switchboard server handles the individual conversation sessions. + messenger.NameserverProcessor.ConnectionEstablished += new EventHandler(NameserverProcessor_ConnectionEstablished); + messenger.Nameserver.SignedIn += new EventHandler(Nameserver_SignedIn); + messenger.Nameserver.SignedOff += new EventHandler(Nameserver_SignedOff); + messenger.NameserverProcessor.ConnectingException += new EventHandler(NameserverProcessor_ConnectingException); + messenger.Nameserver.ExceptionOccurred += new EventHandler(Nameserver_ExceptionOccurred); + messenger.Nameserver.AuthenticationError += new EventHandler(Nameserver_AuthenticationError); + messenger.Nameserver.ServerErrorReceived += new EventHandler(Nameserver_ServerErrorReceived); + + // Receive messages send by MSN contacts. + messenger.MessageManager.MessageArrived += new EventHandler(MessageManager_MessageArrived); + + // Listen for the data transfer events (i.e. file transfer invitation, activity invitation) + messenger.TransferInvitationReceived += new EventHandler(messenger_TransferInvitationReceived); + + // Listen to ping answer event. In each ping answer, MSN will give you a number. That is the interval to send the next Ping. + // You can send a Ping by using Messenger.Nameserver.SendPing(). + messenger.Nameserver.PingAnswer += new EventHandler(Nameserver_PingAnswer); + + messenger.Nameserver.OwnerVerified += new EventHandler(Nameserver_OwnerVerified); + messenger.Nameserver.ContactOnline += new EventHandler(Nameserver_ContactOnline); + messenger.Nameserver.ContactOffline += new EventHandler(Nameserver_ContactOffline); + + + // SynchronizationCompleted will fired after the updated operation for your contact list has completed. + messenger.ContactService.SynchronizationCompleted += new EventHandler(ContactService_SynchronizationCompleted); + // ReverseAdded will fired after a contact adds you to his/her contact list. + messenger.ContactService.ReverseAdded += new EventHandler(Nameserver_ReverseAdded); + + messenger.ContactService.ReverseRemoved += new EventHandler(ContactService_ReverseRemoved); + // ContactAdded will fired after a contact added to any role list. + messenger.ContactService.ContactAdded += new EventHandler(ContactService_ContactAdded); + // ContactRemoved will fired after a contact removed from any role list. + messenger.ContactService.ContactRemoved += new EventHandler(ContactService_ContactRemoved); + + #region Circle events + + // These are circle events. They will be fired after corresponding circle operation completed. + messenger.ContactService.CreateCircleCompleted += new EventHandler(ContactService_CircleCreated); + messenger.ContactService.JoinedCircleCompleted += new EventHandler(ContactService_JoinedCircle); + messenger.ContactService.JoinCircleInvitationReceived += new EventHandler(ContactService_JoinCircleInvitationReceived); + messenger.ContactService.ExitCircleCompleted += new EventHandler(ContactService_ExitCircle); + messenger.ContactService.CircleMemberJoined += new EventHandler(ContactService_CircleMemberJoined); + messenger.ContactService.CircleMemberLeft += new EventHandler(ContactService_CircleMemberLeft); + messenger.Nameserver.CircleOnline += new EventHandler(Nameserver_CircleOnline); + messenger.Nameserver.CircleOffline += new EventHandler(Nameserver_CircleOffline); + messenger.Nameserver.CircleMemberOnline += new EventHandler(Nameserver_CircleMemberOnline); + messenger.Nameserver.CircleMemberOffline += new EventHandler(Nameserver_CircleMemberOffline); + messenger.Nameserver.LeftCircleConversation += new EventHandler(Nameserver_CircleMemberLeftConversation); + messenger.Nameserver.JoinedCircleConversation += new EventHandler(Nameserver_CircleMemberJoinedConversation); + messenger.Nameserver.CircleTextMessageReceived += new EventHandler(Nameserver_CircleTextMessageReceived); + messenger.Nameserver.CircleNudgeReceived += new EventHandler(Nameserver_CircleNudgeReceived); + + #endregion + + + #region Offline Message Operation events + + // OIMReceived will be triggered after receved an Offline Message. + messenger.OIMService.OIMReceived += new EventHandler(Nameserver_OIMReceived); + + // Triggered after the send operation for an Offline Message has been completed. + // If the operation failed, there will contains an error in the event args. + messenger.OIMService.OIMSendCompleted += new EventHandler(OIMService_OIMSendCompleted); + + #endregion + + + messenger.WhatsUpService.GetWhatsUpCompleted += new EventHandler(WhatsUpService_GetWhatsUpCompleted); + + #region Webservice Error handler + + // Handle Service Operation Errors + //In most cases, these error are not so important. + messenger.ContactService.ServiceOperationFailed += new EventHandler(ServiceOperationFailed); + messenger.OIMService.ServiceOperationFailed += new EventHandler(ServiceOperationFailed); + messenger.StorageService.ServiceOperationFailed += new EventHandler(ServiceOperationFailed); + messenger.WhatsUpService.ServiceOperationFailed += new EventHandler(ServiceOperationFailed); + + #endregion + } + + public static class ImageIndexes + { + public const int Closed = 0; + public const int Open = 1; + public const int Circle = 2; + + public const int Online = 3; + public const int Busy = 4; + public const int Away = 5; + public const int Idle = 6; + public const int Hidden = 7; + public const int Offline = 8; + + // Show always (0/0) + public const string FavoritesNodeKey = "__10F"; + public const string CircleNodeKey = "__20C"; + // Sort by status (0) + public const string MobileNodeKey = "__30M"; + public const string OnlineNodeKey = "__32N"; + public const string OfflineNodeKey = "__34F"; + // Sort by categories (0/0) + public const string NoGroupNodeKey = "ZZZZZ"; + + public static int GetStatusIndex(PresenceStatus status) + { + switch (status) + { + case PresenceStatus.Online: + return Online; + + case PresenceStatus.Busy: + case PresenceStatus.Phone: + return Busy; + + case PresenceStatus.BRB: + case PresenceStatus.Away: + case PresenceStatus.Lunch: + return Away; + + case PresenceStatus.Idle: + return Idle; + case PresenceStatus.Hidden: + return Hidden; + + case PresenceStatus.Offline: + return Offline; + + default: + return Offline; + } + } + } + + private void ClientForm_Load(object sender, EventArgs e) + { + ImageList1.Images.Add(MSNPSharpClient.Properties.Resources.closed); + ImageList1.Images.Add(MSNPSharpClient.Properties.Resources.open); + ImageList1.Images.Add(MSNPSharpClient.Properties.Resources.circle); + + ImageList1.Images.Add(MSNPSharpClient.Properties.Resources.online); + ImageList1.Images.Add(MSNPSharpClient.Properties.Resources.busy); + ImageList1.Images.Add(MSNPSharpClient.Properties.Resources.away); + ImageList1.Images.Add(MSNPSharpClient.Properties.Resources.idle); + ImageList1.Images.Add(MSNPSharpClient.Properties.Resources.hidden); + ImageList1.Images.Add(MSNPSharpClient.Properties.Resources.offline); + + Version dllVersion = messenger.GetType().Assembly.GetName().Version; + Text += " (v" + dllVersion.Major + "." + dllVersion.Minor + "." + dllVersion.Build + " r" + dllVersion.Revision + ")"; + treeViewFavoriteList.TreeViewNodeSorter = StatusSorter.Default; + + comboStatus.SelectedIndex = 0; + + if (toolStripSortByStatus.Checked) + SortByStatus(null); + else + SortByGroup(null); + + // ******* Listen traces ***** + traceform.Show(); + } + + + private void ClientForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (Messenger.Connected) + { + Messenger.Nameserver.SignedOff -= Nameserver_SignedOff; + + ResetAll(); + Messenger.Disconnect(); + } + + traceform.Close(); + } + + void Nameserver_CircleMemberOffline(object sender, CircleMemberEventArgs e) + { + RefreshCircleList(sender, e); + } + + void Nameserver_CircleMemberOnline(object sender, CircleMemberEventArgs e) + { + RefreshCircleList(sender, e); + } + + void Nameserver_CircleNudgeReceived(object sender, CircleMemberEventArgs e) + { + Trace.WriteLine("Circle " + e.Circle.ToString() + ": Member: " + e.Member.ToString() + " send you a nudge."); + AutoGroupMessageReply(e.Circle); + } + + private void AutoGroupMessageReply(Circle circle) + { + if (Messenger.ContactList.Owner.Status != PresenceStatus.Hidden || Messenger.ContactList.Owner.Status != PresenceStatus.Offline) + circle.SendMessage(new TextMessage("MSNPSharp example client auto reply.")); + } + + void Nameserver_CircleTextMessageReceived(object sender, CircleTextMessageEventArgs e) + { + Trace.WriteLine("Circle " + e.Sender.ToString() + ": Member: " + e.TriggerMember.ToString() + " send you a message :" + e.Message.ToString()); + AutoGroupMessageReply(e.Sender); + } + + void Nameserver_CircleMemberJoinedConversation(object sender, CircleMemberEventArgs e) + { + Trace.WriteLine("Circle member " + e.Member.ToString() + " joined the circle conversation: " + e.Circle.ToString()); + } + + void Nameserver_CircleMemberLeftConversation(object sender, CircleMemberEventArgs e) + { + Trace.WriteLine("Circle member " + e.Member.ToString() + " has left the circle: " + e.Circle.ToString()); + } + + void Nameserver_CircleOnline(object sender, CircleEventArgs e) + { + Trace.WriteLine("Circle go online: " + e.Circle.ToString()); + RefreshCircleList(sender, e); + } + + void Nameserver_CircleOffline(object sender, CircleEventArgs e) + { + Trace.WriteLine("Circle go offline: " + e.Circle.ToString()); + RefreshCircleList(sender, e); + } + + void ContactService_ExitCircle(object sender, CircleEventArgs e) + { + RefreshCircleList(sender, e); + } + + void ContactService_JoinedCircle(object sender, CircleEventArgs e) + { + RefreshCircleList(sender, e); + messenger.ContactService.ExitCircle(e.Circle); //Demostrate how to leave a circle. + } + + + void ContactService_CircleMemberLeft(object sender, CircleMemberEventArgs e) + { + RefreshCircleList(sender, null); + } + + void ContactService_CircleMemberJoined(object sender, CircleMemberEventArgs e) + { + RefreshCircleList(sender, null); + } + + void ContactService_JoinCircleInvitationReceived(object sender, CircleEventArgs e) + { + messenger.ContactService.AcceptCircleInvitation(e.Circle); + } + + void ContactService_CircleCreated(object sender, CircleEventArgs e) + { + RefreshCircleList(sender, e); + } + + void RefreshCircleList(object sender, EventArgs e) + { + if (InvokeRequired) + { + BeginInvoke(new EventHandler(RefreshCircleList), new object[] { sender, e }); + return; + } + + Contact circle = null; + + if (e is CircleMemberEventArgs) + circle = (e as CircleMemberEventArgs).Circle; + else if (e is CircleEventArgs) + circle = (e as CircleEventArgs).Circle; + + if (toolStripSortByStatus.Checked) + { + SortByStatus(circle); + } + else + { + SortByGroup(circle); + } + } + + void ServiceOperationFailed(object sender, ServiceOperationFailedEventArgs e) + { + Trace.WriteLineIf(Settings.TraceSwitch.TraceError, e.Method + ": " + e.Exception.ToString(), sender.GetType().Name); + } + + void ContactService_SynchronizationCompleted(object sender, EventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(ContactService_SynchronizationCompleted), sender, e); + return; + } + + lblNews.Text = "Getting your friends' news..."; + messenger.WhatsUpService.GetWhatsUp(200); + } + + List activities = new List(); + void WhatsUpService_GetWhatsUpCompleted(object sender, GetWhatsUpCompletedEventArgs e) + { + if (InvokeRequired) + { + BeginInvoke(new EventHandler(WhatsUpService_GetWhatsUpCompleted), new object[] { sender, e }); + return; + } + + if (e.Error != null) + { + lblNews.Text = "ERROR: " + e.Error.ToString(); + } + else + { + activities.Clear(); + + foreach (ActivityDetailsType activityDetails in e.Response.Activities) + { + // Show status news + if (activityDetails.ApplicationId == "6262816084389410") + { + activities.Add(activityDetails); + } + + Contact c = messenger.ContactList.GetContactByCID(long.Parse(activityDetails.OwnerCID)); + + if (c != null) + { + c.Activities.Add(activityDetails); + } + } + + if (activities.Count == 0) + { + lblNews.Text = "No news"; + return; + } + + lblNewsLink.Text = "Get Feeds"; + lblNewsLink.Tag = e.Response.FeedUrl; + tmrNews.Enabled = true; + } + } + + private int currentActivity = 0; + private bool activityForward = true; + private void tmrNews_Tick(object sender, EventArgs e) + { + if (currentActivity >= activities.Count || currentActivity < 0) + { + currentActivity = 0; + } + + ActivityDetailsType activitiy = activities[currentActivity]; + if (activitiy.ApplicationId == "6262816084389410") + { + string name = string.Empty; + string status = string.Empty; + + foreach (TemplateVariableBaseType t in activitiy.TemplateVariables) + { + if (t is PublisherIdTemplateVariable) + { + name = ((PublisherIdTemplateVariable)t).NameHint; + } + else if (t is TextTemplateVariable) + { + status = ((TextTemplateVariable)t).Value; + } + } + + lblNews.Text = name + ": " + status; + + Contact c = messenger.ContactList.GetContactByCID(long.Parse(activitiy.OwnerCID)); + + if (c != null) + { + if (c.DisplayImage != null && c.DisplayImage.Image != null) + { + pbNewsPicture.Image = c.DisplayImage.Image; + } + else if (c.UserTileURL != null) + { + pbNewsPicture.LoadAsync(c.UserTileURL.AbsoluteUri); + } + else + { + pbNewsPicture.Image = null; + } + } + } + if (activityForward) + currentActivity++; + else + currentActivity--; + } + + private void cmdPrev_Click(object sender, EventArgs e) + { + if (activities.Count > 0) + { + activityForward = false; + + if (currentActivity > 0) + currentActivity--; + else + currentActivity = activities.Count - 1; + + if (tmrNews.Enabled) + tmrNews_Tick(this, EventArgs.Empty); + } + } + + private void cmdNext_Click(object sender, EventArgs e) + { + if (activities.Count > 0) + { + activityForward = true; + + if (currentActivity < activities.Count) + currentActivity++; + + if (tmrNews.Enabled) + tmrNews_Tick(this, EventArgs.Empty); + } + } + + private void lblNewsLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + if (lblNewsLink.Tag != null) + { + Process.Start(lblNewsLink.Tag.ToString()); + } + } + + void Owner_PersonalMessageChanged(object sender, EventArgs e) + { + if (InvokeRequired) + { + BeginInvoke(new EventHandler(Owner_PersonalMessageChanged), new object[] { sender, e }); + return; + } + + lblName.Text = Messenger.ContactList.Owner.Name; + + if (Messenger.ContactList.Owner.PersonalMessage != null && Messenger.ContactList.Owner.PersonalMessage.Message != null) + { + lblPM.Text = System.Web.HttpUtility.HtmlDecode(Messenger.ContactList.Owner.PersonalMessage.Message); + } + } + + void Owner_DisplayImageChanged(object sender, DisplayImageChangedEventArgs e) + { + if (InvokeRequired) + { + displayImageBox.BeginInvoke(new EventHandler(Owner_DisplayImageChanged), new object[] { sender, e }); + return; + } + + displayImageBox.Image = e.NewDisplayImage.Image; + } + + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new ClientForm()); + } + + void Nameserver_OwnerVerified(object sender, EventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(Nameserver_OwnerVerified), sender, e); + return; + } + + Messenger.ContactList.Owner.DisplayImageChanged += new EventHandler(Owner_DisplayImageChanged); + Messenger.ContactList.Owner.PersonalMessageChanged += new EventHandler(Owner_PersonalMessageChanged); + Messenger.ContactList.Owner.ScreenNameChanged += new EventHandler(Owner_PersonalMessageChanged); + Messenger.ContactList.Owner.PlacesChanged += new EventHandler(Owner_PlacesChanged); + Messenger.ContactList.Owner.StatusChanged += new EventHandler(Owner_StatusChanged); + } + + void Nameserver_ContactOnline(object sender, ContactEventArgs e) + { + BeginInvoke(new EventHandler(ContactOnlineOffline), new object[] { sender, e }); + } + + void Nameserver_ContactOffline(object sender, ContactEventArgs e) + { + Invoke(new EventHandler(ContactOnlineOffline), new object[] { sender, e }); + } + + void ContactOnlineOffline(object sender, ContactEventArgs e) + { + if (toolStripSortByStatus.Checked) + SortByStatus(e.Contact); + else + SortByGroup(e.Contact); + } + + void Nameserver_PingAnswer(object sender, PingAnswerEventArgs e) + { + nextPing = e.SecondsToWait; + } + + void Nameserver_OIMReceived(object sender, OIMReceivedEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(Nameserver_OIMReceived), sender, e); + return; + } + + if (DialogResult.Yes == MessageBox.Show( + "OIM received at : " + e.ReceivedTime + "\r\nFrom : " + e.NickName + " (" + e.Email + ") " + ":\r\n" + + e.Message + "\r\n\r\n\r\nClick yes, if you want to receive this message next time you login.", + "Offline Message from " + e.Email, MessageBoxButtons.YesNoCancel)) + { + e.IsRead = false; + } + } + + + void MessageManager_MessageArrived(object sender, MessageArrivedEventArgs e) + { + if (InvokeRequired) + { + BeginInvoke(new EventHandler(MessageManager_MessageArrived), new object[] { sender, e }); + return; + } + else + { + foreach (ConversationForm cform in ConversationForms) + { + if (cform.ConversationID == e.ConversationID) + { + //TODO: print message on the form. + cform.OnMessageReceived(sender, e); + return; + } + } + + CreateConversationForm(e.Sender, e.ConversationID).OnMessageReceived(sender, e); + } + } + + void OIMService_OIMSendCompleted(object sender, OIMSendCompletedEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(OIMService_OIMSendCompleted), sender, e); + return; + } + + if (e.Error != null) + { + MessageBox.Show(e.Error.Message, "OIM Send Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + void ContactService_ContactRemoved(object sender, ListMutateEventArgs e) + { + Trace.WriteLine(e.Contact.Hash + " removed from the " + e.AffectedList + " role list."); + } + + void ContactService_ContactAdded(object sender, ListMutateEventArgs e) + { + if (Messenger.Nameserver.IsSignedIn) + { + e.Contact.OnForwardList = true; + e.Contact.OnAllowedList = true; + } + Trace.WriteLine(e.Contact.Hash + " added to the " + e.AffectedList + " role list."); + + } + + void ContactService_ReverseRemoved(object sender, ContactEventArgs e) + { + Trace.WriteLine(e.Contact.Hash + " removed you their contact (forward) list."); + } + + void Nameserver_ReverseAdded(object sender, ContactEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(Nameserver_ReverseAdded), sender, e); + return; + } + + Contact contact = e.Contact; + if (messenger.ContactList.Owner.NotifyPrivacy == NotifyPrivacy.PromptOnAdd + /* || messenger.Nameserver.BotMode */) //If you want your provisioned account in botmode to fire ReverseAdded event, uncomment this. + { + // Show pending window if it is necessary. + if (contact.OnPendingList || + (contact.OnReverseList && !contact.OnAllowedList && !contact.OnBlockedList)) + { + ReverseAddedForm form = new ReverseAddedForm(contact); + form.FormClosed += delegate(object f, FormClosedEventArgs fce) + { + form = f as ReverseAddedForm; + if (DialogResult.OK == form.DialogResult) + { + if (form.AddToContactList) + { + messenger.ContactService.AddNewContact(contact.Mail); + System.Threading.Thread.Sleep(200); + + if (form.Blocked) + { + contact.Blocked = true; + } + } + else if (form.Blocked) + { + contact.Blocked = true; + } + else + { + contact.OnAllowedList = true; + } + + System.Threading.Thread.Sleep(200); + contact.OnPendingList = false; + } + return; + }; + form.Show(this); + } + else + { + MessageBox.Show(contact.Mail + " accepted your invitation and added you their contact list."); + } + } + } + + + /// + /// A delegate passed to Invoke in order to create the conversation form in the thread of the main form. + /// + private delegate void SetStatusDelegate(string status); + + private void SetStatusSynchronized(string status) + { + statusBar.Text = status; + } + + private void SetStatus(string status) + { + if (InvokeRequired) + { + this.Invoke(new SetStatusDelegate(SetStatusSynchronized), new object[] { status }); + } + else + { + SetStatusSynchronized(status); + } + } + + /// + /// Sign into the messenger network. Disconnect first if a connection has already been established. + /// + /// + /// + private void loginButton_Click(object sender, System.EventArgs e) + { + switch (Convert.ToInt32(loginButton.Tag)) + { + case 0: // not connected -> connect + { + if (messenger.Connected) + { + SetStatus("Disconnecting from server"); + messenger.Disconnect(); + } + + // set the credentials, this is ofcourse something every MSNPSharp program will need to implement. + messenger.Credentials = new Credentials(accountTextBox.Text, passwordTextBox.Text, MsnProtocol.MSNP18); + + // inform the user what is happening and try to connecto to the messenger network. + SetStatus("Connecting to server"); + messenger.Connect(); + + displayImageBox.Image = global::MSNPSharpClient.Properties.Resources.loading; + + loginButton.Tag = 1; + loginButton.Text = "Cancel"; + initialExpand = true; + + // note that Messenger.Connect() will run in a seperate thread and return immediately. + // it will fire events that informs you about the status of the connection attempt. + // these events are registered in the constructor. + + } + break; + + case 1: // connecting -> cancel + { + if (messenger.Connected) + messenger.Disconnect(); + + if (toolStripSortByStatus.Checked) + SortByStatus(null); + else + SortByGroup(null); + + displayImageBox.Image = null; + loginButton.Tag = 0; + loginButton.Text = "> Sign in"; + pnlNameAndPM.Visible = false; + comboPlaces.Visible = false; + initialExpand = true; + + } + break; + + case 2: // connected -> disconnect + { + if (messenger.Connected) + messenger.Disconnect(); + + if (toolStripSortByStatus.Checked) + SortByStatus(null); + else + SortByGroup(null); + + displayImageBox.Image = null; + loginButton.Tag = 0; + loginButton.Text = "> Sign in"; + pnlNameAndPM.Visible = true; + comboPlaces.Visible = true; + initialExpand = true; + + } + break; + } + } + + private void login_KeyPress(object sender, KeyPressEventArgs e) + { + if ((e.KeyChar == '\r') || (e.KeyChar == '\r')) + { + loginButton.PerformClick(); + } + } + + void Owner_StatusChanged(object sender, StatusChangedEventArgs e) + { + if (InvokeRequired) + { + BeginInvoke(new EventHandler(Owner_StatusChanged), new object[] { sender, e }); + return; + } + + if (messenger.Nameserver.IsSignedIn) + { + comboStatus.SelectedIndex = comboStatus.FindString(GetStatusString(Messenger.ContactList.Owner.Status)); + } + } + + private string GetStatusString(PresenceStatus status) + { + switch (status) + { + case PresenceStatus.Away: + case PresenceStatus.BRB: + case PresenceStatus.Lunch: + case PresenceStatus.Idle: + return "Away"; + case PresenceStatus.Online: + return "Online"; + case PresenceStatus.Offline: + return "Offline"; + case PresenceStatus.Hidden: + return "Hidden"; + case PresenceStatus.Busy: + case PresenceStatus.Phone: + return "Busy"; + + } + + return "Offline"; + } + + private void comboStatus_SelectedIndexChanged(object sender, EventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(comboStatus_SelectedIndexChanged), sender, e); + return; + } + + PresenceStatus newstatus = (PresenceStatus)Enum.Parse(typeof(PresenceStatus), comboStatus.Text); + + if (messenger.Connected) + { + if (newstatus == PresenceStatus.Offline) + { + PresenceStatus old = Messenger.ContactList.Owner.Status; + + foreach (ConversationForm convform in ConversationForms) + { + if (convform.Visible == true) + { + if (MessageBox.Show("You are signing out from example client. All windows will be closed.", "Sign out", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) + { + return; + } + else + { + break; + } + } + } + + Messenger.Disconnect(); + comboStatus.SelectedIndex = 0; + } + else + { + Messenger.ContactList.Owner.Status = newstatus; + } + } + else if (newstatus == PresenceStatus.Offline) + { + comboStatus.SelectedIndex = 0; + } + } + + private void comboStatus_DrawItem(object sender, DrawItemEventArgs e) + { + if (e.Index == -1) + return; + + e.Graphics.FillRectangle(Brushes.White, e.Bounds); + if ((e.State & DrawItemState.Selected) != DrawItemState.None) + e.DrawBackground(); + + PresenceStatus newstatus = (PresenceStatus)Enum.Parse(typeof(PresenceStatus), comboStatus.Items[e.Index].ToString()); + Brush brush = Brushes.Green; + + switch (newstatus) + { + case PresenceStatus.Online: + brush = Brushes.Green; + break; + + case PresenceStatus.Busy: + brush = Brushes.Red; + break; + + case PresenceStatus.Away: + brush = Brushes.Orange; + break; + + case PresenceStatus.Hidden: + brush = Brushes.Gray; + break; + + case PresenceStatus.Offline: + brush = Brushes.Black; + break; + } + + Point imageLocation = new Point(e.Bounds.X + 2, e.Bounds.Y + 2); + e.Graphics.FillRectangle(brush, new Rectangle(imageLocation, new Size(12, 12))); + + PointF textLocation = new PointF(imageLocation.X + 16, imageLocation.Y); + e.Graphics.DrawString(newstatus.ToString(), PARENT_NODE_FONT, Brushes.Black, textLocation); + } + + private void comboPlaces_SelectedIndexChanged(object sender, EventArgs e) + { + if (comboPlaces.SelectedIndex > 0) + { + string place = comboPlaces.Text.Split(' ')[comboPlaces.Text.Split(' ').Length - 1]; + if (comboPlaces.SelectedIndex == 1) + { + Messenger.ContactList.Owner.Status = PresenceStatus.Offline; + comboPlaces.Visible = false; + } + else if (comboPlaces.SelectedIndex >= 1) + { + Guid placeId = places[comboPlaces.SelectedIndex - 2]; + if (placeId == Guid.Empty) + { + comboPlaces.Visible = false; + Messenger.ContactList.Owner.SignoutFromEverywhere(); + } + else + { + Messenger.ContactList.Owner.SignoutFrom(placeId); //places does not contain the current places. + } + } + } + } + + void cbRobotMode_CheckedChanged(object sender, EventArgs e) + { + ComboBox cbBotMode = sender as ComboBox; + messenger.Nameserver.BotMode = cbRobotMode.Checked; + } + + List places = new List(0); + + private void Owner_PlacesChanged(object sender, EventArgs e) + { + if (comboPlaces.InvokeRequired) + { + comboPlaces.BeginInvoke(new EventHandler(Owner_PlacesChanged), new object[] { sender, e }); + return; + } + + // if (Messenger.ContactList.Owner.Places.Count > 1) + { + comboPlaces.BeginUpdate(); + comboPlaces.Items.Clear(); + comboPlaces.Items.Add("(" + Messenger.ContactList.Owner.PlaceCount + ") Places"); + comboPlaces.Items.Add("Signout from here (" + Messenger.ContactList.Owner.EpName + ")"); + + foreach (KeyValuePair keyvalue in Messenger.ContactList.Owner.EndPointData) + { + if (keyvalue.Key != NSMessageHandler.MachineGuid) + { + comboPlaces.Items.Add("Signout from " + (keyvalue.Value as PrivateEndPointData).Name); + places.Add(keyvalue.Key); + } + } + + comboPlaces.SelectedIndex = 0; + comboPlaces.Visible = true; + comboPlaces.EndUpdate(); + } + } + + private void NameserverProcessor_ConnectionEstablished(object sender, EventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(NameserverProcessor_ConnectionEstablished), sender, e); + return; + } + + messenger.Nameserver.AutoSynchronize = !cbRobotMode.Checked; + + SetStatus("Connected to server"); + } + + private void Nameserver_SignedIn(object sender, EventArgs e) + { + + if (InvokeRequired) + { + BeginInvoke(new EventHandler(Nameserver_SignedIn), sender, e); + return; + } + + SetStatus("Signed into the messenger network as " + Messenger.ContactList.Owner.Name); + + // set our presence status + loginButton.Tag = 2; + loginButton.Text = "Sign off"; + pnlNameAndPM.Visible = true; + comboPlaces.Visible = true; + + Messenger.ContactList.Owner.Status = (PresenceStatus)Enum.Parse(typeof(PresenceStatus), comboStatus.Text); + + propertyGrid.SelectedObject = Messenger.ContactList.Owner; + displayImageBox.Image = Messenger.ContactList.Owner.DisplayImage.Image; + displayImageBox.SizeMode = PictureBoxSizeMode.Zoom; + + UpdateContactlist(sender, e); + } + + private void Nameserver_SignedOff(object sender, SignedOffEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(Nameserver_SignedOff), sender, e); + return; + } + + SetStatus("Signed off from the messenger network"); + ResetAll(); + } + + private void ResetAll() + { + tmrKeepOnLine.Enabled = false; + tmrNews.Enabled = false; + + displayImageBox.Image = null; + displayImageBox.SizeMode = PictureBoxSizeMode.CenterImage; + + loginButton.Tag = 0; + loginButton.Text = "> Sign in"; + pnlNameAndPM.Visible = false; + comboPlaces.Visible = false; + propertyGrid.SelectedObject = null; + + treeViewFavoriteList.Nodes.Clear(); + treeViewFilterList.Nodes.Clear(); + + if (toolStripSortByStatus.Checked) + SortByStatus(null); + else + SortByGroup(null); + + places.Clear(); + + List convFormsClone = new List(ConversationForms); + foreach(ConversationForm convForm in convFormsClone) + { + convForm.Close(); + } + } + + private void Nameserver_ExceptionOccurred(object sender, ExceptionEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(Nameserver_ExceptionOccurred), new object[] { sender, e }); + } + else + { + + // ignore the unauthorized exception, since we're handling that error in another method. + if (e.Exception is UnauthorizedException) + return; + + MessageBox.Show(e.Exception.ToString(), "Nameserver exception"); + } + } + + private void NameserverProcessor_ConnectingException(object sender, ExceptionEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(Nameserver_ExceptionOccurred), new object[] { sender, e }); + } + else + { + MessageBox.Show(e.Exception.ToString(), "Connecting exception"); + SetStatus("Connecting failed"); + } + } + + private void Nameserver_AuthenticationError(object sender, ExceptionEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(Nameserver_ExceptionOccurred), new object[] { sender, e }); + } + else + { + MessageBox.Show("Authentication failed, check your account or password.\r\n Error detail:\r\n " + e.Exception.InnerException.Message + "\r\n" + + " StackTrace:\r\n " + e.Exception.InnerException.StackTrace + , "Authentication Error"); + SetStatus("Authentication failed"); + } + } + + /// + /// Updates the treeView. + /// + private void UpdateContactlist(object sender, EventArgs e) + { + if (messenger.Connected == false) + return; + + if (toolStripSortByStatus.Checked) + SortByStatus(null); + else + SortByGroup(null); + + tmrKeepOnLine.Enabled = true; + } + + + /// + /// Notifies the user of errors which are send by the MSN server. + /// + /// + /// + private void Nameserver_ServerErrorReceived(object sender, MSNErrorEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(Nameserver_ServerErrorReceived), new object[] { sender, e }); + } + else + { + // when the MSN server sends an error code we want to be notified. + MessageBox.Show(e.MSNError.ToString(), "Server error received"); + SetStatus("Server error received"); + } + } + + /// + /// A delegate passed to Invoke in order to create the conversation form in the thread of the main form. + /// + private delegate ConversationForm CreateConversationDelegate(Contact remote, ConversationID cid); + + private ConversationForm CreateConversationForm(Contact remote, ConversationID cid) + { + + // create a new conversation. However do not show the window untill a message is received. + // for example, a conversation will be created when the remote client sends wants to send + // you a file. You don't want to show the conversation form in that case. + ConversationForm conversationForm = new ConversationForm(Messenger, remote, cid); + // do this to create the window handle. Otherwise we are not able to call Invoke() on the + // conversation form later. + conversationForm.Handle.ToInt32(); + ConversationForms.Add(conversationForm); + + conversationForm.FormClosing += delegate + { + ConversationForms.Remove(conversationForm); + }; + + return conversationForm; + } + + + /// + /// Asks the user to accept or deny the incoming filetransfer invitation. + /// + /// + /// + private void messenger_TransferInvitationReceived(object sender, MSNSLPInvitationEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(messenger_TransferInvitationReceived), sender, e); + return; + } + + if (e.TransferProperties.DataType == DataTransferType.File) + { + e.DelayProcess = true; + + FileTransferForm ftf = new FileTransferForm(e); + ftf.Show(this); + + } + else if (e.TransferProperties.DataType == DataTransferType.Activity) + { + if (MessageBox.Show( + e.TransferProperties.RemoteContact.Name + + " wants to invite you to join an activity.\r\nActivity name: " + + e.Activity.ActivityName + "\r\nAppID: " + e.Activity.AppID, + "Activity invitation", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + e.TransferSession.DataStream = new MemoryStream(); + e.Accept = true; + e.TransferSession.AutoCloseStream = true; + } + } + } + + private int nextPing = 50; + private void tmrKeepOnLine_Tick(object sender, EventArgs e) + { + if (nextPing > 0) + nextPing--; + if (nextPing == 0) + { + nextPing--; + messenger.Nameserver.SendPing(); + } + } + + + + private static Font PARENT_NODE_FONT = new Font("Tahoma", 8f, FontStyle.Bold); + private static Font PARENT_NODE_FONT_BANNED = new Font("Tahoma", 8f, FontStyle.Bold | FontStyle.Strikeout); + private static Font USER_NODE_FONT = new Font("Tahoma", 8f); + private static Font USER_NODE_FONT_BANNED = new Font("Tahoma", 8f, FontStyle.Strikeout); + public class StatusSorter : IComparer + { + public static StatusSorter Default = new StatusSorter(); + private StatusSorter() + { + } + public int Compare(object x, object y) + { + TreeNode node = x as TreeNode; + TreeNode node2 = y as TreeNode; + + if (node.Tag is string && node2.Tag is string) + { + // Online (0), Offline (1) + return node.Tag.ToString().CompareTo(node2.Tag.ToString()); + } + else if (node.Tag is Circle && node2.Tag is Circle) + { + + return ((Circle)node.Tag).AddressBookId.CompareTo(((Circle)node2.Tag).AddressBookId); + + } + else if (node.Tag is Contact && node2.Tag is Contact) + { + if (((Contact)node.Tag).Online == ((Contact)node2.Tag).Online) + { + return string.Compare(((Contact)node.Tag).Name, ((Contact)node2.Tag).Name, StringComparison.CurrentCultureIgnoreCase); + } + if (((Contact)node.Tag).Online) + return -1; + else if (((Contact)node2.Tag).Online) + return 1; + } + else if (node.Tag is ContactGroup && node2.Tag is ContactGroup) + { + return string.Compare(((ContactGroup)node.Tag).Name, ((ContactGroup)node2.Tag).Name, StringComparison.CurrentCultureIgnoreCase); + } + return 0; + } + } + + private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) + { + if ((e.Button == MouseButtons.Left) && (e.Node.Level != 0)) + { + Contact selectedContact = treeViewFavoriteList.SelectedNode.Tag as Contact; + + if (selectedContact != null) + { + propertyGrid.SelectedObject = selectedContact; + + if (selectedContact.Online && (!(selectedContact is Circle))) + { + sendIMMenuItem.PerformClick(); + } + } + } + } + + private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + if (e.Node.Level == 0) + { + if (e.Node.IsExpanded || (e.Node.ImageIndex == ImageIndexes.Open)) + { + e.Node.Collapse(); + e.Node.ImageIndex = e.Node.SelectedImageIndex = (e.Node.Tag is Circle) ? ImageIndexes.Circle : ImageIndexes.Closed; + } + else if (e.Node.Nodes.Count > 0) + { + e.Node.Expand(); + e.Node.ImageIndex = e.Node.SelectedImageIndex = (e.Node.Tag is Circle) ? ImageIndexes.Circle : ImageIndexes.Open; + } + if (e.Node.Tag is ContactGroup || e.Node.Tag is Circle) + { + propertyGrid.SelectedObject = e.Node.Tag; + } + } + else + { + Contact selectedContact = (Contact)e.Node.Tag; + + if (selectedContact is Circle) + { + if (e.Node.IsExpanded) + { + e.Node.Collapse(); + } + else + { + e.Node.Expand(); + } + } + + propertyGrid.SelectedObject = selectedContact; + } + } + else if (e.Button == MouseButtons.Right) + { + if (e.Node.Tag is Contact && e.Node.Level > 0) + { + treeViewFavoriteList.SelectedNode = e.Node; + Contact contact = (Contact)treeViewFavoriteList.SelectedNode.Tag; + + if (contact.Blocked) + { + blockMenuItem.Visible = false; + unblockMenuItem.Visible = true; + } + else + { + blockMenuItem.Visible = true; + unblockMenuItem.Visible = false; + } + + if (contact.Online) + { + sendIMMenuItem.Visible = true; + sendOIMMenuItem.Visible = false; + + toolStripMenuItem2.Visible = true; + } + else + { + sendIMMenuItem.Visible = false; + sendOIMMenuItem.Visible = true; + + toolStripMenuItem2.Visible = false; + } + + deleteMenuItem.Visible = contact.Guid != Guid.Empty; + + Point point = treeViewFavoriteList.PointToScreen(new Point(e.X, e.Y)); + userMenuStrip.Show(point.X - userMenuStrip.Width, point.Y); + } + else if (e.Node.Tag is ContactGroup) + { + treeViewFavoriteList.SelectedNode = e.Node; + + Point point = treeViewFavoriteList.PointToScreen(new Point(e.X, e.Y)); + groupContextMenu.Show(point.X - groupContextMenu.Width, point.Y); + } + } + } + + private void blockToolStripMenuItem_Click(object sender, EventArgs e) + { + ((Contact)treeViewFavoriteList.SelectedNode.Tag).Blocked = true; + treeViewFavoriteList.SelectedNode.NodeFont = USER_NODE_FONT_BANNED; + } + + private void unblockMenuItem_Click(object sender, EventArgs e) + { + ((Contact)treeViewFavoriteList.SelectedNode.Tag).Blocked = false; + treeViewFavoriteList.SelectedNode.NodeFont = USER_NODE_FONT; + } + + private void deleteMenuItem_Click(object sender, EventArgs e) + { + Contact contact = (Contact)treeViewFavoriteList.SelectedNode.Tag; + RemoveContactForm form = new RemoveContactForm(); + form.FormClosed += delegate(object f, FormClosedEventArgs fce) + { + form = f as RemoveContactForm; + if (DialogResult.OK == form.DialogResult) + { + if (form.Block) + { + contact.Blocked = true; + } + + if (form.RemoveFromAddressBook) + { + messenger.ContactService.RemoveContact(contact); + } + else + { + contact.IsMessengerUser = false; + } + } + }; + form.ShowDialog(this); + } + + private void sendMessageToolStripMenuItem_Click(object sender, EventArgs e) + { + Contact contact = treeViewFavoriteList.SelectedNode.Tag as Contact; + if (!contact.IsMessengerUser) return; + + if (!contact.OnForwardList) + { + AddContactForm acf = new AddContactForm(contact.Mail); + + if (DialogResult.OK == acf.ShowDialog(this) && + acf.Account != String.Empty) + { + messenger.ContactService.AddNewContact(acf.Account, acf.InvitationMessage); + } + + return; + } + + bool activate = false; + ConversationForm activeForm = null; + + if (contact.ClientType != ClientType.EmailMember) + { + foreach (ConversationForm conv in ConversationForms) + { + if (contact.IsSibling(conv.ConversationID.RemoteOwner)) + { + activeForm = conv; + activate = true; + } + } + } + + if (activate) + { + if (activeForm.WindowState == FormWindowState.Minimized || activeForm.Visible == false) + activeForm.Show(); + + activeForm.Activate(); + return; + } + + //Get the conversation identifier, then you can use: + // conversationIdentifier = _messenger.MessageManager.SendTextMessage(ConversationID, message); + //To send a message. + ConversationID conversationIdentifier = Messenger.MessageManager.GetID(contact); + ConversationForm form = CreateConversationForm(contact, conversationIdentifier); + + form.Show(); + } + + private void sendOfflineMessageToolStripMenuItem_Click(object sender, EventArgs e) + { + Contact selectedContact = (Contact)treeViewFavoriteList.SelectedNode.Tag; + this.propertyGrid.SelectedObject = selectedContact; + messenger.OIMService.SendOIMMessage(selectedContact, new TextMessage("MSNPSharp offline message test.")); + + } + + private void sendMIMMenuItem_Click(object sender, EventArgs e) + { + Contact selectedContact = (Contact)treeViewFavoriteList.SelectedNode.Tag; + this.propertyGrid.SelectedObject = selectedContact; + + if (selectedContact.MobileAccess || selectedContact.ClientType == ClientType.PhoneMember) + { + messenger.Nameserver.SendMobileMessage(selectedContact, "MSNP mobile message"); + } + else + MessageBox.Show("This contact is not able to receive mobile messages"); + } + + + private void btnSortBy_Click(object sender, EventArgs e) + { + Button sortByButton = sender as Button; + int x = ((base.Location.X + splitContainer1.Panel1.Width + sortByButton.Left)) + 15; + int y = (base.Location.Y + tableLayoutPanel3.Height + sortByButton.Top) + 3 * btnSortBy.Height; + sortContextMenu.Show(x, y); + sortContextMenu.Focus(); + } + + private void toolStripSortByStatus_Click(object sender, EventArgs e) + { + if (this.toolStripSortByStatus.Checked) + { + treeViewFavoriteList.Nodes.RemoveByKey(ImageIndexes.NoGroupNodeKey); + foreach (ContactGroup cg in messenger.ContactGroups) + { + treeViewFavoriteList.Nodes.RemoveByKey(cg.Guid); + } + + SortByStatus(null); + } + else + { + this.toolStripSortByStatus.Checked = true; + } + } + + private bool initialExpand = true; + + private string GetCircleDisplayName(Circle circle) + { + if (circle == null) + return string.Empty; + + return circle.Name + " (" + circle.ContactList.Values.Count.ToString() + " members)"; + } + + + private void SortByFavAndCircle(Contact contactToUpdate) + { + TreeNode favoritesNode = null; // (0/0) + TreeNode circlesNode = null; // (0/0) + + if (treeViewFavoriteList.Nodes.ContainsKey(ImageIndexes.FavoritesNodeKey)) + { + favoritesNode = treeViewFavoriteList.Nodes[ImageIndexes.FavoritesNodeKey]; + } + else + { + favoritesNode = treeViewFavoriteList.Nodes.Add(ImageIndexes.FavoritesNodeKey, "Favorites", ImageIndexes.Closed, ImageIndexes.Closed); + favoritesNode.NodeFont = PARENT_NODE_FONT; + favoritesNode.Tag = ImageIndexes.FavoritesNodeKey; + } + + if (treeViewFavoriteList.Nodes.ContainsKey(ImageIndexes.CircleNodeKey)) + { + circlesNode = treeViewFavoriteList.Nodes[ImageIndexes.CircleNodeKey]; + } + else + { + circlesNode = treeViewFavoriteList.Nodes.Add(ImageIndexes.CircleNodeKey, "Circles", ImageIndexes.Closed, ImageIndexes.Closed); + circlesNode.NodeFont = PARENT_NODE_FONT; + circlesNode.Tag = ImageIndexes.CircleNodeKey; + } + + if (contactToUpdate == null) + { + // Initial sort + favoritesNode.Nodes.Clear(); + circlesNode.Nodes.Clear(); + + foreach (Circle circle in Messenger.CircleList) + { + TreeNode circleNode = circlesNode.Nodes.Add(circle.Hash, GetCircleDisplayName(circle), ImageIndexes.Circle, ImageIndexes.Circle); + circleNode.NodeFont = circle.Blocked ? PARENT_NODE_FONT_BANNED : PARENT_NODE_FONT; + circleNode.Tag = circle; + + foreach (Contact contact in circle.ContactList.All) + { + // Get real passport contact to chat with... If this contact isn't on our forward list, show add contact form... + string text = contact.Name; + if (contact.PersonalMessage != null && !String.IsNullOrEmpty(contact.PersonalMessage.Message)) + { + text += " - " + contact.PersonalMessage.Message; + } + if (contact.Name != contact.Mail) + { + text += " (" + contact.Mail + ")"; + } + + TreeNode newnode = circleNode.Nodes.Add(contact.Hash, text); + newnode.NodeFont = contact.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + newnode.ImageIndex = newnode.SelectedImageIndex = ImageIndexes.GetStatusIndex(contact.Status); + newnode.Tag = contact; + } + } + + ContactGroup favGroup = messenger.ContactGroups.FavoriteGroup; + if (favGroup != null) + { + foreach (Contact c in messenger.ContactList.Forward) + { + if (c.HasGroup(favGroup)) + { + string text = c.Name; + if (c.PersonalMessage != null && !String.IsNullOrEmpty(c.PersonalMessage.Message)) + { + text += " - " + c.PersonalMessage.Message; + } + if (c.Name != c.Mail) + { + text += " (" + c.Mail + ")"; + } + + TreeNode newnode = favoritesNode.Nodes.ContainsKey(c.Hash) ? + favoritesNode.Nodes[c.Hash] : favoritesNode.Nodes.Add(c.Hash, text); + + newnode.NodeFont = c.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + newnode.ImageIndex = newnode.SelectedImageIndex = ImageIndexes.GetStatusIndex(c.Status); + newnode.Tag = c; + } + } + } + } + else if (contactToUpdate is Circle) + { + // Circle event + Circle circle = contactToUpdate as Circle; + bool isDeleted = (Messenger.CircleList[circle.AddressBookId, circle.HostDomain] == null); + + if (!isDeleted) + { + TreeNode circlenode = circlesNode.Nodes.ContainsKey(circle.Hash) ? + circlesNode.Nodes[circle.Hash] : circlesNode.Nodes.Add(circle.Hash, GetCircleDisplayName(circle), ImageIndexes.Circle, ImageIndexes.Circle); + + circlenode.NodeFont = circle.Blocked ? PARENT_NODE_FONT_BANNED : PARENT_NODE_FONT; + circlenode.Tag = circle; + + foreach (Contact contact in circle.ContactList.All) + { + // Get real passport contact to chat with... If this contact isn't on our forward list, show add contact form... + string text2 = contact.Name; + if (contact.PersonalMessage != null && !String.IsNullOrEmpty(contact.PersonalMessage.Message)) + { + text2 += " - " + contact.PersonalMessage.Message; + } + if (contact.Name != contact.Mail) + { + text2 += " (" + contact.Mail + ")"; + } + + TreeNode newnode = circlenode.Nodes.ContainsKey(contact.Hash) ? + circlenode.Nodes[contact.Hash] : circlenode.Nodes.Add(contact.Hash, text2); + + newnode.Text = text2; + newnode.ImageIndex = newnode.SelectedImageIndex = ImageIndexes.GetStatusIndex(contact.Status); + newnode.NodeFont = contact.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + newnode.Tag = contact; + } + + circlenode.Text = GetCircleDisplayName(circle); + } + else + { + circlesNode.Nodes.RemoveByKey(circle.Hash); + } + } + else + { + // Contact event... Contact is not null. + // Favorite + ContactGroup favGroup = messenger.ContactGroups.FavoriteGroup; + if (favGroup != null && contactToUpdate.HasGroup(favGroup)) + { + Contact contact = messenger.ContactList[contactToUpdate.Mail, contactToUpdate.ClientType]; + string text = contact.Name; + if (contact.PersonalMessage != null && !String.IsNullOrEmpty(contact.PersonalMessage.Message)) + { + text += " - " + contact.PersonalMessage.Message; + } + if (contact.Name != contact.Mail) + { + text += " (" + contact.Mail + ")"; + } + + TreeNode contactNode = favoritesNode.Nodes.ContainsKey(contactToUpdate.Hash) ? + favoritesNode.Nodes[contactToUpdate.Hash] : favoritesNode.Nodes.Add(contactToUpdate.Hash, text); + + contactNode.NodeFont = contact.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + contactNode.ImageIndex = contactNode.SelectedImageIndex = ImageIndexes.GetStatusIndex(contactToUpdate.Status); + contactNode.Tag = contactToUpdate; + } + } + + int onlineCount = 0; + foreach (TreeNode nodeFav in favoritesNode.Nodes) + { + if (nodeFav.Tag is Contact && (((Contact)nodeFav.Tag).Online)) + { + onlineCount++; + } + } + string newText = "Favorites (" + onlineCount + "/" + favoritesNode.Nodes.Count + ")"; + if (favoritesNode.Text != newText) + favoritesNode.Text = newText; + + onlineCount = 0; + foreach (TreeNode nodeCircle in circlesNode.Nodes) + { + if (nodeCircle.Tag is Circle && (((Circle)nodeCircle.Tag).Online)) + { + onlineCount++; + } + } + + newText = "Circles (" + onlineCount + "/" + circlesNode.Nodes.Count + ")"; + if (circlesNode.Text != newText) + circlesNode.Text = newText; + } + + private void SortByStatus(Contact contactToUpdate) + { + TreeNode selectedNode = treeViewFavoriteList.SelectedNode; + bool isExpanded = (selectedNode != null && selectedNode.IsExpanded); + + //treeViewFavoriteList.BeginUpdate(); + + if (toolStripSortBygroup.Checked) + toolStripSortBygroup.Checked = false; + + SortByFavAndCircle(contactToUpdate); + + TreeNode onlineNode = null; // (0) + TreeNode mobileNode = null; // (0) + TreeNode offlineNode = null; // (0) + + if (treeViewFavoriteList.Nodes.ContainsKey(ImageIndexes.OnlineNodeKey)) + { + onlineNode = treeViewFavoriteList.Nodes[ImageIndexes.OnlineNodeKey]; + } + else + { + onlineNode = treeViewFavoriteList.Nodes.Add(ImageIndexes.OnlineNodeKey, "Online", ImageIndexes.Closed, ImageIndexes.Closed); + onlineNode.NodeFont = contactToUpdate == null ? PARENT_NODE_FONT : (contactToUpdate.Blocked ? PARENT_NODE_FONT_BANNED : PARENT_NODE_FONT); + onlineNode.Tag = ImageIndexes.OnlineNodeKey; + } + + if (treeViewFavoriteList.Nodes.ContainsKey(ImageIndexes.MobileNodeKey)) + { + mobileNode = treeViewFavoriteList.Nodes[ImageIndexes.MobileNodeKey]; + } + else + { + mobileNode = treeViewFavoriteList.Nodes.Add(ImageIndexes.MobileNodeKey, "Mobile", ImageIndexes.Closed, ImageIndexes.Closed); + mobileNode.NodeFont = PARENT_NODE_FONT; + mobileNode.Tag = ImageIndexes.MobileNodeKey; + } + + if (treeViewFavoriteList.Nodes.ContainsKey(ImageIndexes.OfflineNodeKey)) + { + offlineNode = treeViewFavoriteList.Nodes[ImageIndexes.OfflineNodeKey]; + } + else + { + offlineNode = treeViewFavoriteList.Nodes.Add(ImageIndexes.OfflineNodeKey, "Offline", ImageIndexes.Closed, ImageIndexes.Closed); + offlineNode.NodeFont = PARENT_NODE_FONT; + offlineNode.Tag = ImageIndexes.OfflineNodeKey; + } + + // Re-sort all + if (contactToUpdate == null) + { + mobileNode.Nodes.Clear(); + onlineNode.Nodes.Clear(); + offlineNode.Nodes.Clear(); + + foreach (Contact contact in messenger.ContactList.All) + { + string text = contact.Name; + if (contact.PersonalMessage != null && !String.IsNullOrEmpty(contact.PersonalMessage.Message)) + { + text += " - " + contact.PersonalMessage.Message; + } + if (contact.Name != contact.Mail) + { + text += " (" + contact.Mail + ")"; + } + + TreeNode newnode = contact.Online ? onlineNode.Nodes.Add(contact.Hash, text) : offlineNode.Nodes.Add(contact.Hash, text); + newnode.ImageIndex = newnode.SelectedImageIndex = ImageIndexes.GetStatusIndex(contact.Status); + newnode.NodeFont = contact.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + newnode.Tag = contact; + + if (contact.MobileAccess || contact.ClientType == ClientType.PhoneMember) + { + TreeNode newnode2 = mobileNode.Nodes.Add(contact.Hash, text); + newnode2.ImageIndex = newnode2.SelectedImageIndex = ImageIndexes.GetStatusIndex(contact.Status); + newnode2.NodeFont = contact.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + newnode2.Tag = contact; + } + } + } + else if ((contactToUpdate is Circle) == false) + { + TreeNode contactNode = null; + + if (contactToUpdate.Online) + { + if (offlineNode.Nodes.ContainsKey(contactToUpdate.Hash)) + { + offlineNode.Nodes.RemoveByKey(contactToUpdate.Hash); + } + if (onlineNode.Nodes.ContainsKey(contactToUpdate.Hash)) + { + contactNode = onlineNode.Nodes[contactToUpdate.Hash]; + } + } + else + { + if (onlineNode.Nodes.ContainsKey(contactToUpdate.Hash)) + { + onlineNode.Nodes.RemoveByKey(contactToUpdate.Hash); + } + if (offlineNode.Nodes.ContainsKey(contactToUpdate.Hash)) + { + contactNode = offlineNode.Nodes[contactToUpdate.Hash]; + } + } + + string text = contactToUpdate.Name; + if (contactToUpdate.PersonalMessage != null && !String.IsNullOrEmpty(contactToUpdate.PersonalMessage.Message)) + { + text += " - " + contactToUpdate.PersonalMessage.Message; + } + if (contactToUpdate.Name != contactToUpdate.Mail) + { + text += " (" + contactToUpdate.Mail + ")"; + } + + if (contactNode == null) + { + contactNode = contactToUpdate.Online ? onlineNode.Nodes.Add(contactToUpdate.Hash, text) : offlineNode.Nodes.Add(contactToUpdate.Hash, text); + } + + if (contactNode.Text != text) + contactNode.Text = text; + + contactNode.ImageIndex = contactNode.SelectedImageIndex = ImageIndexes.GetStatusIndex(contactToUpdate.Status); + contactNode.NodeFont = contactToUpdate.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + contactNode.Tag = contactToUpdate; + + if (contactToUpdate.MobileAccess || contactToUpdate.ClientType == ClientType.PhoneMember) + { + TreeNode newnode2 = mobileNode.Nodes.ContainsKey(contactToUpdate.Hash) ? + mobileNode.Nodes[contactToUpdate.Hash] : mobileNode.Nodes.Add(contactToUpdate.Hash, text); + + newnode2.ImageIndex = newnode2.SelectedImageIndex = ImageIndexes.GetStatusIndex(contactToUpdate.Status); + newnode2.NodeFont = contactToUpdate.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + newnode2.Tag = contactToUpdate; + } + } + + string newText = "Online (" + onlineNode.Nodes.Count.ToString() + ")"; + if (onlineNode.Text != newText) + onlineNode.Text = newText; + + newText = "Offline (" + offlineNode.Nodes.Count.ToString() + ")"; + if (offlineNode.Text != newText) + offlineNode.Text = newText; + + newText = "Mobile (" + mobileNode.Nodes.Count.ToString() + ")"; + if (mobileNode.Text != newText) + mobileNode.Text = newText; + + treeViewFavoriteList.Sort(); + + if (selectedNode != null) + { + treeViewFavoriteList.SelectedNode = selectedNode; + + if (isExpanded && treeViewFavoriteList.SelectedNode != null) + { + treeViewFavoriteList.SelectedNode.Expand(); + } + } + else + { + if (initialExpand && onlineNode.Nodes.Count > 0) + { + onlineNode.Expand(); + onlineNode.ImageIndex = ImageIndexes.Open; + + initialExpand = false; + } + } + + //treeViewFavoriteList.EndUpdate(); + treeViewFavoriteList.AllowDrop = false; + } + + private void toolStripSortBygroup_Click(object sender, EventArgs e) + { + if (this.toolStripSortBygroup.Checked) + { + treeViewFavoriteList.Nodes.RemoveByKey(ImageIndexes.OnlineNodeKey); + treeViewFavoriteList.Nodes.RemoveByKey(ImageIndexes.MobileNodeKey); + treeViewFavoriteList.Nodes.RemoveByKey(ImageIndexes.OfflineNodeKey); + + SortByGroup(null); + } + else + { + this.toolStripSortBygroup.Checked = true; + } + } + + private void SortByGroup(Contact contactToUpdate) + { + this.treeViewFavoriteList.BeginUpdate(); + this.toolStripSortByStatus.Checked = false; + + SortByFavAndCircle(contactToUpdate); + + foreach (ContactGroup group in this.messenger.ContactGroups) + { + if (group.IsFavorite == false) + { + TreeNode node = treeViewFavoriteList.Nodes.ContainsKey(group.Guid) ? + treeViewFavoriteList.Nodes[group.Guid] : treeViewFavoriteList.Nodes.Add(group.Guid, group.Name, ImageIndexes.Closed, ImageIndexes.Closed); + + node.ImageIndex = ImageIndexes.Closed; + node.NodeFont = PARENT_NODE_FONT; + node.Tag = group; + node.Text = "0"; + } + } + + TreeNode common = treeViewFavoriteList.Nodes.ContainsKey(ImageIndexes.NoGroupNodeKey) ? + treeViewFavoriteList.Nodes[ImageIndexes.NoGroupNodeKey] : treeViewFavoriteList.Nodes.Add(ImageIndexes.NoGroupNodeKey, "Others", 0, 0); + + common.ImageIndex = ImageIndexes.Closed; + common.NodeFont = PARENT_NODE_FONT; + common.Tag = ImageIndexes.NoGroupNodeKey; + common.Text = "0"; + + foreach (Contact contact in messenger.ContactList.All) + { + string text = contact.Name; + if (contact.PersonalMessage != null && !String.IsNullOrEmpty(contact.PersonalMessage.Message)) + { + text += " - " + contact.PersonalMessage.Message; + } + if (contact.Name != contact.Mail) + { + text += " (" + contact.Mail + ")"; + } + + if (contact.ContactGroups.Count == 0) + { + TreeNode newnode = common.Nodes.ContainsKey(contact.Hash) ? + common.Nodes[contact.Hash] : common.Nodes.Add(contact.Hash, text); + + newnode.ImageIndex = newnode.SelectedImageIndex = ImageIndexes.GetStatusIndex(contact.Status); + newnode.NodeFont = contact.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + newnode.Tag = contact; + newnode.Text = text; + + if (contact.Online) + common.Text = (Convert.ToInt32(common.Text) + 1).ToString(); + } + else + { + foreach (ContactGroup group in contact.ContactGroups) + { + if (group.IsFavorite == false) + { + TreeNode found = treeViewFavoriteList.Nodes[group.Guid]; + TreeNode newnode = found.Nodes.Add(contact.Hash, contact.Name); + newnode.ImageIndex = newnode.SelectedImageIndex = ImageIndexes.GetStatusIndex(contact.Status); + newnode.NodeFont = contact.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + newnode.Tag = contact; + + if (contact.Online) + found.Text = (Convert.ToInt32(found.Text) + 1).ToString(); + } + } + } + } + + foreach (TreeNode nodeGroup in treeViewFavoriteList.Nodes) + { + if (nodeGroup.Tag is ContactGroup) + { + nodeGroup.Text = ((ContactGroup)nodeGroup.Tag).Name + "(" + nodeGroup.Text + "/" + nodeGroup.Nodes.Count + ")"; + } + } + + common.Text = "Others (" + common.Text + "/" + common.Nodes.Count + ")"; + + treeViewFavoriteList.Sort(); + treeViewFavoriteList.EndUpdate(); + treeViewFavoriteList.AllowDrop = true; + } + + private void treeViewFavoriteList_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false)) + { + e.Effect = DragDropEffects.Move; + } + else + { + e.Effect = DragDropEffects.None; + } + } + + private void treeViewFavoriteList_ItemDrag(object sender, ItemDragEventArgs e) + { + if ((e.Item is TreeNode)/* && (((TreeNode)e.Item).Level > 0)*/) + { + base.DoDragDrop(e.Item, DragDropEffects.Move); + } + } + + private void treeViewFavoriteList_DragOver(object sender, DragEventArgs e) + { + Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y)); + TreeNode nodeAt = ((TreeView)sender).GetNodeAt(pt); + TreeNode data = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode"); + if (((data.Level == 0) || (data.Parent == nodeAt)) || (nodeAt.Parent == data.Parent)) + { + e.Effect = DragDropEffects.None; + } + else + { + e.Effect = DragDropEffects.Move; + } + } + + private void treeViewFavoriteList_DragDrop(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false)) + { + TreeNode contactNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode"); + if (contactNode.Level != 0) + { + Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y)); + TreeNode newgroupNode = (((TreeView)sender).GetNodeAt(pt).Level == 0) ? ((TreeView)sender).GetNodeAt(pt) : ((TreeView)sender).GetNodeAt(pt).Parent; + TreeNode oldgroupNode = contactNode.Parent; + Contact contact = (Contact)contactNode.Tag; + bool flag = true; + try + { + if (newgroupNode.Tag is ContactGroup) + { + messenger.ContactService.AddContactToGroup(contact, (ContactGroup)newgroupNode.Tag); + } + if (oldgroupNode.Tag is ContactGroup) + { + messenger.ContactService.RemoveContactFromGroup(contact, (ContactGroup)oldgroupNode.Tag); + } + } + catch (Exception) + { + flag = false; + } + + if (flag) + { + treeViewFavoriteList.BeginUpdate(); + TreeNode node3 = (TreeNode)contactNode.Clone(); + newgroupNode.Nodes.Add(node3); + contactNode.Remove(); + treeViewFavoriteList.EndUpdate(); + + newgroupNode.Text = newgroupNode.Text.Split(new char[] { '/' })[0] + "/" + newgroupNode.Nodes.Count + ")"; + oldgroupNode.Text = oldgroupNode.Text.Split(new char[] { '/' })[0] + "/" + oldgroupNode.Nodes.Count + ")"; + } + } + } + } + + private void toolStripDeleteGroup_Click(object sender, EventArgs e) + { + ContactGroup selectedGroup = (ContactGroup)treeViewFavoriteList.SelectedNode.Tag; + this.propertyGrid.SelectedObject = selectedGroup; + + messenger.ContactGroups.Remove(selectedGroup); + + System.Threading.Thread.Sleep(500); + Application.DoEvents(); + System.Threading.Thread.Sleep(500); + + SortByGroup(null); + } + + private void btnAddNew_Click(object sender, EventArgs e) + { + if (this.loginButton.Tag.ToString() != "2") + { + MessageBox.Show("Please sign in first."); + return; + } + + AddContactForm acf = new AddContactForm(String.Empty); + if (DialogResult.OK == acf.ShowDialog(this) && acf.Account != String.Empty) + { + messenger.ContactService.AddNewContact(acf.Account, acf.InvitationMessage); + } + } + + private void createCircleMenuItem_Click(object sender, EventArgs e) + { + //This is a demostration to tell you how to use MSNPSharp to create, block, and unblock Circle. + messenger.ContactService.CreateCircle("test wp circle"); + messenger.ContactService.CreateCircleCompleted += new EventHandler(ContactService_TestingCircleAdded); + } + + void ContactService_TestingCircleAdded(object sender, CircleEventArgs e) + { + //Circle created, then show you how to block. + ////if (!e.Circle.OnBlockedList) + ////{ + //// messenger.ContactService.BlockCircle(e.Circle); + //// e.Circle.ContactBlocked += new EventHandler(Circle_ContactBlocked); + //// Trace.WriteLine("Circle blocked: " + e.Circle.ToString()); + ////} + + ////Trace.WriteLine("Circle created: " + e.Circle.ToString()); + } + + void Circle_ContactBlocked(object sender, EventArgs e) + { + //Circle blocked, show you how to unblock. + Circle circle = sender as Circle; + if (circle != null) + { + messenger.ContactService.UnBlockCircle(circle); + circle.ContactUnBlocked += new EventHandler(circle_ContactUnBlocked); + Trace.WriteLine("Circle unblocked: " + circle.ToString()); + } + } + + void circle_ContactUnBlocked(object sender, EventArgs e) + { + //This demo shows you how to invite a contact to your circle. + if (messenger.ContactList.HasContact("freezingsoft@hotmail.com", ClientType.PassportMember)) + { + messenger.ContactService.InviteCircleMember(sender as Circle, messenger.ContactList["freezingsoft@hotmail.com", ClientType.PassportMember], "hello"); + messenger.ContactService.InviteCircleMemberCompleted += new EventHandler(ContactService_CircleMemberInvited); + } + } + + void ContactService_CircleMemberInvited(object sender, CircleMemberEventArgs e) + { + Trace.WriteLine("Invited: " + e.Member.Hash); + } + + private void importContactsMenuItem_Click(object sender, EventArgs e) + { + ImportContacts ic = new ImportContacts(); + if (ic.ShowDialog(this) == DialogResult.OK) + { + string invitation = ic.InvitationMessage; + foreach (String account in ic.Contacts) + { + messenger.ContactService.AddNewContact(account, invitation); + } + } + } + + private void txtSearch_TextChanged(object sender, EventArgs e) + { + if (txtSearch.Text == String.Empty || txtSearch.Text == "Search contacts") + { + treeViewFilterList.Nodes.Clear(); + treeViewFavoriteList.Visible = true; + treeViewFilterList.Visible = false; + } + else + { + treeViewFilterList.Nodes.Clear(); + treeViewFavoriteList.Visible = false; + treeViewFilterList.Visible = true; + TreeNode foundnode = treeViewFilterList.Nodes.Add("0", "Search Results:"); + + foreach (Contact contact in messenger.ContactList.All) + { + if (contact.Mail.IndexOf(txtSearch.Text, StringComparison.CurrentCultureIgnoreCase) != -1 + || + contact.Name.IndexOf(txtSearch.Text, StringComparison.CurrentCultureIgnoreCase) != -1) + { + TreeNode newnode = foundnode.Nodes.Add(contact.Hash, contact.Name); + newnode.NodeFont = contact.Blocked ? USER_NODE_FONT_BANNED : USER_NODE_FONT; + newnode.Tag = contact; + } + } + foundnode.Text = "Search Results: " + foundnode.Nodes.Count; + foundnode.Expand(); + } + } + + private void txtSearch_Enter(object sender, EventArgs e) + { + if (txtSearch.Text == "Search contacts") + { + txtSearch.Text = String.Empty; + } + } + + private void txtSearch_Leave(object sender, EventArgs e) + { + if (txtSearch.Text == String.Empty) + { + txtSearch.Text = "Search contacts"; + } + } + + private void lblName_Leave(object sender, EventArgs e) + { + string dn = lblName.Text; + string pm = lblPM.Text; + + List lstPersonalMessage = new List(new string[] { "", "" }); + + if (dn != messenger.ContactList.Owner.Name) + { + + lstPersonalMessage[0] = dn; + } + + if (messenger.ContactList.Owner.PersonalMessage == null || pm != messenger.ContactList.Owner.PersonalMessage.Message) + { + lstPersonalMessage[1] = pm; + + } + + Thread updateThread = new Thread(new ParameterizedThreadStart(UpdateProfile)); + updateThread.Start(lstPersonalMessage); + } + + private void comboStatus_KeyPress(object sender, KeyPressEventArgs e) + { + if (!messenger.Connected) + { + login_KeyPress(sender, e); + } + } + + private void displayImageBox_Click(object sender, EventArgs e) + { + if (messenger.Connected) + { + if (openImageDialog.ShowDialog() == DialogResult.OK) + { + Image newImage = Image.FromFile(openImageDialog.FileName, true); + Thread updateThread = new Thread(new ParameterizedThreadStart(UpdateProfile)); + updateThread.Start(newImage); + } + } + } + + private void UpdateProfile(object profileObject) + { + Trace.WriteLineIf(Settings.TraceSwitch.TraceInfo, "Updating owner profile, please wait...."); + + if (profileObject is Image) + { + bool updateResult = messenger.StorageService.UpdateProfile(profileObject as Image, "MyPhoto"); + Trace.WriteLineIf(Settings.TraceSwitch.TraceInfo, "Update displayimage completed. Result = " + updateResult); + } + + if (profileObject is List) + { + List lstPersonalMessage = profileObject as List; + if (lstPersonalMessage[0] != "") + { + messenger.ContactList.Owner.Name = lstPersonalMessage[0]; + } + + if (lstPersonalMessage[1] != "") + { + messenger.ContactList.Owner.PersonalMessage = new PersonalMessage(lstPersonalMessage[1], MediaType.None, null, NSMessageHandler.MachineGuid); + } + + Trace.WriteLineIf(Settings.TraceSwitch.TraceInfo, "Update personal message completed."); + } + } + + private void btnSetMusic_Click(object sender, EventArgs e) + { + MusicForm musicForm = new MusicForm(); + if (musicForm.ShowDialog() == DialogResult.OK) + { + Messenger.ContactList.Owner.PersonalMessage = new PersonalMessage( + Messenger.ContactList.Owner.PersonalMessage.Message, + MediaType.Music, + new string[] { musicForm.Artist, musicForm.Song, musicForm.Album, "" }, + NSMessageHandler.MachineGuid); + } + } + + + } +} diff --git a/Example/DotMSNClient.csproj b/Example/DotMSNClient.csproj new file mode 100644 index 0000000..b9b26b0 --- /dev/null +++ b/Example/DotMSNClient.csproj @@ -0,0 +1,257 @@ + + + + Local + 8.0.50727 + 2.0 + {BDF3E472-EFE8-44D6-AFB6-062DD929D56F} + Debug + AnyCPU + MSNPSharp_logo.ico + + + DotMSNClient + JScript + Grid + IE50 + false + WinExe + MSNPSharpClient + OnBuildSuccess + MSNPSharpClient.ClientForm + + + + + v2.0 + 2.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + bin\Debug\ + 285212672 + + + TRACE;DEBUG + + + true + 4096 + false + false + false + 4 + full + prompt + AllRules.ruleset + + + bin\Release\ + 285212672 + + + TRACE + + + 4096 + true + false + false + 4 + none + prompt + AllRules.ruleset + + + + System + + + System.Data + + + System.Drawing + + + + + System.Windows.Forms + + + System.XML + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + AddContactForm.cs + + + Form + + + Form + + + FileTransferForm.cs + + + Form + + + DotMSNClient.cs + + + Form + + + ImportContacts.cs + + + Form + + + MusicForm.cs + + + + True + True + Resources.resx + + + Form + + + RemoveContactForm.cs + + + Form + + + ReverseAddedForm.cs + + + Component + + + Form + + + TraceForm.cs + + + Designer + AddContactForm.cs + + + ConversationForm.cs + Designer + + + FileTransferForm.cs + Designer + + + DotMSNClient.cs + Designer + + + Designer + ImportContacts.cs + + + Designer + MusicForm.cs + + + Designer + ResXFileCodeGenerator + Resources.Designer.cs + + + Designer + RemoveContactForm.cs + + + Designer + ReverseAddedForm.cs + + + Designer + TraceForm.cs + + + + + {97CB2DC7-2FE8-4AF5-84D0-6B9872A5E960} + MSNPSharp + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + + + \ No newline at end of file diff --git a/Example/DotMSNClient.csproj.user b/Example/DotMSNClient.csproj.user new file mode 100644 index 0000000..6f23531 --- /dev/null +++ b/Example/DotMSNClient.csproj.user @@ -0,0 +1,13 @@ + + + + + + + + + + en-US + false + + \ No newline at end of file diff --git a/Example/DotMSNClient.resx b/Example/DotMSNClient.resx new file mode 100644 index 0000000..19a2329 --- /dev/null +++ b/Example/DotMSNClient.resx @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 118, 17 + + + 776, 17 + + + 506, 17 + + + 228, 17 + + + 639, 17 + + + 17, 17 + + + 17, 56 + + + 163, 56 + + + 322, 56 + + + 76 + + \ No newline at end of file diff --git a/Example/FileTransferForm.Designer.cs b/Example/FileTransferForm.Designer.cs new file mode 100644 index 0000000..da2292e --- /dev/null +++ b/Example/FileTransferForm.Designer.cs @@ -0,0 +1,164 @@ +namespace MSNPSharpClient +{ + partial class FileTransferForm + { + /// + /// 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() + { + this.lblFile = new System.Windows.Forms.Label(); + this.txtFilePath = new System.Windows.Forms.TextBox(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.progressBar = new System.Windows.Forms.ProgressBar(); + this.button1 = new System.Windows.Forms.Button(); + this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); + this.label1 = new System.Windows.Forms.Label(); + this.lblSize = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblFile + // + this.lblFile.AutoSize = true; + this.lblFile.Location = new System.Drawing.Point(18, 8); + this.lblFile.Name = "lblFile"; + this.lblFile.Size = new System.Drawing.Size(29, 12); + this.lblFile.TabIndex = 0; + this.lblFile.Text = "File"; + // + // txtFilePath + // + this.txtFilePath.Location = new System.Drawing.Point(64, 6); + this.txtFilePath.Name = "txtFilePath"; + this.txtFilePath.Size = new System.Drawing.Size(270, 21); + this.txtFilePath.TabIndex = 3; + this.txtFilePath.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // btnOK + // + this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnOK.Location = new System.Drawing.Point(64, 94); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(164, 37); + this.btnOK.TabIndex = 6; + this.btnOK.Tag = "OK"; + this.btnOK.Text = "OK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // btnCancel + // + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(237, 94); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(97, 37); + this.btnCancel.TabIndex = 7; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // progressBar + // + this.progressBar.Location = new System.Drawing.Point(64, 56); + this.progressBar.Name = "progressBar"; + this.progressBar.Size = new System.Drawing.Size(270, 21); + this.progressBar.Step = 1; + this.progressBar.TabIndex = 8; + this.progressBar.Visible = false; + // + // button1 + // + this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.button1.Location = new System.Drawing.Point(254, 30); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(80, 21); + this.button1.TabIndex = 9; + this.button1.Text = "Browse..."; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // saveFileDialog + // + this.saveFileDialog.Filter = "*.*|*.*"; + this.saveFileDialog.RestoreDirectory = true; + this.saveFileDialog.Title = "Save as..."; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(18, 34); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(29, 12); + this.label1.TabIndex = 10; + this.label1.Text = "Size"; + // + // lblSize + // + this.lblSize.AutoSize = true; + this.lblSize.Location = new System.Drawing.Point(61, 34); + this.lblSize.Name = "lblSize"; + this.lblSize.Size = new System.Drawing.Size(35, 12); + this.lblSize.TabIndex = 11; + this.lblSize.Text = "bytes"; + // + // FileTransferForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnCancel; + this.ClientSize = new System.Drawing.Size(345, 142); + this.ControlBox = false; + this.Controls.Add(this.lblSize); + this.Controls.Add(this.label1); + this.Controls.Add(this.button1); + this.Controls.Add(this.progressBar); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.txtFilePath); + this.Controls.Add(this.lblFile); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FileTransferForm"; + this.Text = "File Transfer"; + this.Load += new System.EventHandler(this.FileTransferForm_Load); + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FileTransferForm_FormClosing); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblFile; + private System.Windows.Forms.TextBox txtFilePath; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.ProgressBar progressBar; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.SaveFileDialog saveFileDialog; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lblSize; + } +} \ No newline at end of file diff --git a/Example/FileTransferForm.cs b/Example/FileTransferForm.cs new file mode 100644 index 0000000..cad3cb0 --- /dev/null +++ b/Example/FileTransferForm.cs @@ -0,0 +1,172 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Diagnostics; + +namespace MSNPSharpClient +{ + using MSNPSharp; + using MSNPSharp.Core; + using MSNPSharp.DataTransfer; + + + public partial class FileTransferForm : Form + { + MSNSLPInvitationEventArgs invite; + private bool transferFinished; + + public FileTransferForm(MSNSLPInvitationEventArgs invite) + { + this.invite = invite; + InitializeComponent(); + } + + private void FileTransferForm_Load(object sender, EventArgs e) + { + string appPath = Path.GetFullPath("."); + + Text = "File Transfer: " + invite.TransferProperties.RemoteContact.Mail; + txtFilePath.Text = Path.Combine(appPath, invite.Filename); + lblSize.Text = invite.FileSize.ToString() + " bytes"; + + invite.TransferSession.TransferStarted += (TransferSession_TransferStarted); + invite.TransferSession.TransferProgressed += (TransferSession_TransferProgressed); + invite.TransferSession.TransferAborted += (TransferSession_TransferAborted); + invite.TransferSession.TransferFinished += (TransferSession_TransferFinished); + } + + void TransferSession_TransferStarted(object sender, EventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(TransferSession_TransferStarted), sender, e); + return; + } + + progressBar.Visible = true; + lblSize.Text = "Transfer started"; + } + + void TransferSession_TransferProgressed(object sender, P2PTransferProgressedEventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(TransferSession_TransferProgressed), sender, e); + return; + } + progressBar.Visible = true; + progressBar.Value = e.Percent; + lblSize.Text = "Transferred: " + e.Transferred + " / " + e.TotalSize; + } + + void TransferSession_TransferFinished(object sender, EventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(TransferSession_TransferFinished), sender, e); + return; + } + + transferFinished = true; + + btnOK.Text = "Open File"; + btnOK.Tag = "OPENFILE"; + btnCancel.Visible = true; + + lblSize.Text = "Transfer finished"; + progressBar.Visible = false; + progressBar.Value = 0; + } + + void TransferSession_TransferAborted(object sender, EventArgs e) + { + if (InvokeRequired) + { + Invoke(new EventHandler(TransferSession_TransferAborted), sender, e); + return; + } + + btnOK.Text = "Close"; + btnOK.Tag = "CLOSE"; + lblSize.Text = "Transfer aborted"; + + progressBar.Visible = false; + progressBar.Value = 0; + + } + + private void button1_Click(object sender, EventArgs e) + { + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + txtFilePath.Text = saveFileDialog.FileName; + } + } + + private void btnCancel_Click(object sender, EventArgs e) + { + if (transferFinished) + { + Close(); + } + else + { + invite.Accept = false; + invite.TransferHandler.RejectTransfer(invite); + + btnCancel.Visible = false; + Close(); + } + } + + private void btnOK_Click(object sender, EventArgs e) + { + switch (btnOK.Tag.ToString()) + { + case "OK": + + invite.TransferSession.DataStream = new FileStream(txtFilePath.Text, FileMode.Create, FileAccess.Write); + invite.TransferSession.AutoCloseStream = true; + invite.Accept = true; + invite.TransferHandler.AcceptTransfer(invite); + + btnCancel.Visible = false; + + lblSize.Text = "Waiting to start..."; + + btnOK.Text = "Abort Transfer"; + btnOK.Tag = "ABORT"; + break; + + case "ABORT": + invite.TransferHandler.CloseSession(invite.TransferSession); + btnOK.Text = "Close"; + btnOK.Tag = "CLOSE"; + break; + + case "OPENFILE": + Process.Start(txtFilePath.Text); + Close(); + break; + + case "CLOSE": + Close(); + break; + } + } + + private void FileTransferForm_FormClosing(object sender, FormClosingEventArgs e) + { + invite.TransferSession.TransferStarted -= (TransferSession_TransferStarted); + invite.TransferSession.TransferProgressed -= (TransferSession_TransferProgressed); + invite.TransferSession.TransferAborted -= (TransferSession_TransferAborted); + invite.TransferSession.TransferFinished -= (TransferSession_TransferFinished); + } + + } +}; \ No newline at end of file diff --git a/Example/FileTransferForm.resx b/Example/FileTransferForm.resx new file mode 100644 index 0000000..d957dca --- /dev/null +++ b/Example/FileTransferForm.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Example/ImportContacts.Designer.cs b/Example/ImportContacts.Designer.cs new file mode 100644 index 0000000..f3e9914 --- /dev/null +++ b/Example/ImportContacts.Designer.cs @@ -0,0 +1,120 @@ +namespace MSNPSharpClient +{ + partial class ImportContacts + { + /// + /// 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() + { + this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); + this.lblInvitation = new System.Windows.Forms.Label(); + this.txtInvitation = new System.Windows.Forms.TextBox(); + this.browseFile = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // openFileDialog + // + this.openFileDialog.DefaultExt = "ctt"; + this.openFileDialog.Filter = "Messenger Contact List|*.ctt"; + this.openFileDialog.Title = "Select Contact File"; + // + // lblInvitation + // + this.lblInvitation.AutoSize = true; + this.lblInvitation.Location = new System.Drawing.Point(12, 20); + this.lblInvitation.Name = "lblInvitation"; + this.lblInvitation.Size = new System.Drawing.Size(96, 13); + this.lblInvitation.TabIndex = 0; + this.lblInvitation.Text = "Invitation Message"; + // + // txtInvitation + // + this.txtInvitation.Location = new System.Drawing.Point(114, 17); + this.txtInvitation.Name = "txtInvitation"; + this.txtInvitation.Size = new System.Drawing.Size(342, 20); + this.txtInvitation.TabIndex = 1; + this.txtInvitation.Text = "Accept me :)"; + // + // browseFile + // + this.browseFile.Location = new System.Drawing.Point(114, 43); + this.browseFile.Name = "browseFile"; + this.browseFile.Size = new System.Drawing.Size(134, 23); + this.browseFile.TabIndex = 2; + this.browseFile.Text = "Browse Contact File..."; + this.browseFile.UseVisualStyleBackColor = true; + this.browseFile.Click += new System.EventHandler(this.browseFile_Click); + // + // button1 + // + this.button1.DialogResult = System.Windows.Forms.DialogResult.OK; + this.button1.Location = new System.Drawing.Point(283, 73); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(84, 23); + this.button1.TabIndex = 3; + this.button1.Text = "OK"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button_Click); + // + // button2 + // + this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.button2.Location = new System.Drawing.Point(373, 73); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(83, 23); + this.button2.TabIndex = 4; + this.button2.Text = "Cancel"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button_Click); + // + // ImportContacts + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(466, 108); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Controls.Add(this.browseFile); + this.Controls.Add(this.txtInvitation); + this.Controls.Add(this.lblInvitation); + this.Name = "ImportContacts"; + this.Text = "Import Contacts"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.OpenFileDialog openFileDialog; + private System.Windows.Forms.Label lblInvitation; + private System.Windows.Forms.TextBox txtInvitation; + private System.Windows.Forms.Button browseFile; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + } +} \ No newline at end of file diff --git a/Example/ImportContacts.cs b/Example/ImportContacts.cs new file mode 100644 index 0000000..8df59d5 --- /dev/null +++ b/Example/ImportContacts.cs @@ -0,0 +1,73 @@ +using System; +using System.IO; +using System.Xml; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using MSNPSharp; + +namespace MSNPSharpClient +{ + public partial class ImportContacts : Form + { + public ImportContacts() + { + InitializeComponent(); + } + + + private string invitationMessage = String.Empty; + public string InvitationMessage + { + get + { + return invitationMessage; + } + } + + private List _contacts = new List(); + public List Contacts + { + get + { + return _contacts; + } + } + + private void browseFile_Click(object sender, EventArgs e) + { + if (DialogResult.OK == openFileDialog.ShowDialog(this)) + { + Contacts.Clear(); + invitationMessage = txtInvitation.Text; + try + { + XmlDocument doc = new XmlDocument(); + doc.LoadXml(File.ReadAllText(openFileDialog.FileName)); + + XmlNodeList contacts = doc.GetElementsByTagName("contact"); + foreach (XmlNode contactNode in contacts) + { + if (ClientType.PassportMember == (ClientType)Convert.ToInt32(contactNode.Attributes["type"].Value)) + { + Contacts.Add(contactNode.InnerText.ToLower(System.Globalization.CultureInfo.InvariantCulture)); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + MessageBox.Show(Contacts.Count.ToString() + " contacts to be imported."); + } + } + + private void button_Click(object sender, EventArgs e) + { + Close(); + } + } +} \ No newline at end of file diff --git a/Example/ImportContacts.resx b/Example/ImportContacts.resx new file mode 100644 index 0000000..f901ebb --- /dev/null +++ b/Example/ImportContacts.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Example/MSNPSharp_logo.ico b/Example/MSNPSharp_logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..7ba3fdb6bbff73a133cde8aaaf9ccbf1c7d718fc GIT binary patch literal 92854 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 anI4uUSs1*@uum53u`TkalpDUPQ2Y + /// 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() + { + this.lblArtist = new System.Windows.Forms.Label(); + this.lblSong = new System.Windows.Forms.Label(); + this.lblAlbum = new System.Windows.Forms.Label(); + this.txtArtist = new System.Windows.Forms.TextBox(); + this.txtSong = new System.Windows.Forms.TextBox(); + this.txtAlbum = new System.Windows.Forms.TextBox(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblArtist + // + this.lblArtist.AutoSize = true; + this.lblArtist.Location = new System.Drawing.Point(18, 9); + this.lblArtist.Name = "lblArtist"; + this.lblArtist.Size = new System.Drawing.Size(30, 13); + this.lblArtist.TabIndex = 0; + this.lblArtist.Text = "Artist"; + // + // lblSong + // + this.lblSong.AutoSize = true; + this.lblSong.Location = new System.Drawing.Point(16, 35); + this.lblSong.Name = "lblSong"; + this.lblSong.Size = new System.Drawing.Size(32, 13); + this.lblSong.TabIndex = 1; + this.lblSong.Text = "Song"; + // + // lblAlbum + // + this.lblAlbum.AutoSize = true; + this.lblAlbum.Location = new System.Drawing.Point(12, 59); + this.lblAlbum.Name = "lblAlbum"; + this.lblAlbum.Size = new System.Drawing.Size(36, 13); + this.lblAlbum.TabIndex = 2; + this.lblAlbum.Text = "Album"; + // + // txtArtist + // + this.txtArtist.Location = new System.Drawing.Point(64, 6); + this.txtArtist.Name = "txtArtist"; + this.txtArtist.Size = new System.Drawing.Size(297, 20); + this.txtArtist.TabIndex = 3; + // + // txtSong + // + this.txtSong.Location = new System.Drawing.Point(64, 32); + this.txtSong.Name = "txtSong"; + this.txtSong.Size = new System.Drawing.Size(297, 20); + this.txtSong.TabIndex = 4; + // + // txtAlbum + // + this.txtAlbum.Location = new System.Drawing.Point(64, 56); + this.txtAlbum.Name = "txtAlbum"; + this.txtAlbum.Size = new System.Drawing.Size(297, 20); + this.txtAlbum.TabIndex = 5; + // + // btnOK + // + this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnOK.Location = new System.Drawing.Point(204, 82); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(75, 23); + this.btnOK.TabIndex = 6; + this.btnOK.Text = "OK"; + this.btnOK.UseVisualStyleBackColor = true; + // + // btnCancel + // + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(285, 82); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(76, 23); + this.btnCancel.TabIndex = 7; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + // + // MusicForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(374, 113); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.txtAlbum); + this.Controls.Add(this.txtSong); + this.Controls.Add(this.txtArtist); + this.Controls.Add(this.lblAlbum); + this.Controls.Add(this.lblSong); + this.Controls.Add(this.lblArtist); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "MusicForm"; + this.Text = "I am Listening..."; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblArtist; + private System.Windows.Forms.Label lblSong; + private System.Windows.Forms.Label lblAlbum; + private System.Windows.Forms.TextBox txtArtist; + private System.Windows.Forms.TextBox txtSong; + private System.Windows.Forms.TextBox txtAlbum; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Button btnCancel; + } +} \ No newline at end of file diff --git a/Example/MusicForm.cs b/Example/MusicForm.cs new file mode 100644 index 0000000..b4b177d --- /dev/null +++ b/Example/MusicForm.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MSNPSharpClient +{ + public partial class MusicForm : Form + { + public MusicForm() + { + InitializeComponent(); + } + + + public string Artist + { + get + { + return txtArtist.Text; + } + } + + public string Song + { + get + { + return txtSong.Text; + } + } + + public string Album + { + get + { + return txtSong.Text; + } + } + + } +} \ No newline at end of file diff --git a/Example/MusicForm.resx b/Example/MusicForm.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Example/MusicForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Example/Properties/AssemblyInfo.cs b/Example/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2d78b1d --- /dev/null +++ b/Example/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: ComVisibleAttribute(false)] +[assembly: CLSCompliantAttribute(false)] +[assembly: AssemblyTitleAttribute("MSNPSharp Example Client")] +[assembly: AssemblyDescriptionAttribute(".NET MSN Messenger library Example Client")] +[assembly: AssemblyCopyrightAttribute("Copyright (c) 2002-2011, Bas Geertsema, Xih Solutions (http://www.xihsolutions.net), Thiago.Sayao, Pang Wu, Ethem Evlice.")] +[assembly: AssemblyProductAttribute("MSNPSharp")] +[assembly: AssemblyDelaySignAttribute(false)] +[assembly: GuidAttribute("FAE04EC0-301F-11D3-BF4B-00C04F79EFBC")] + +// Version information for an assembly consists of the following four values: +// Major.Minor.Build.SVNRevision +[assembly: AssemblyVersionAttribute("3.2.1.2668")] +[assembly: AssemblyFileVersionAttribute("3.2.1.2668")] +[assembly: AssemblyCompanyAttribute("MSNPSharp")] +[assembly: AssemblyTrademarkAttribute("MSNPSharp")] diff --git a/Example/Properties/Resources.Designer.cs b/Example/Properties/Resources.Designer.cs new file mode 100644 index 0000000..4eaef34 --- /dev/null +++ b/Example/Properties/Resources.Designer.cs @@ -0,0 +1,303 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MSNPSharpClient.Properties { + using System; + + + /// + /// 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)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MSNPSharpClient.Properties.Resources", typeof(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 resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap app_banner { + get { + object obj = ResourceManager.GetObject("app_banner", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap away { + get { + object obj = ResourceManager.GetObject("away", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap biggrin { + get { + object obj = ResourceManager.GetObject("biggrin", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap busy { + get { + object obj = ResourceManager.GetObject("busy", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap circle { + get { + object obj = ResourceManager.GetObject("circle", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap closed { + get { + object obj = ResourceManager.GetObject("closed", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Color_fontHS { + get { + object obj = ResourceManager.GetObject("Color_fontHS", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap file { + get { + object obj = ResourceManager.GetObject("file", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap hidden { + get { + object obj = ResourceManager.GetObject("hidden", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap idle { + get { + object obj = ResourceManager.GetObject("idle", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap inner_emoticon { + get { + object obj = ResourceManager.GetObject("inner_emoticon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap loading { + get { + object obj = ResourceManager.GetObject("loading", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon msn_ico { + get { + object obj = ResourceManager.GetObject("msn_ico", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon MSNPSharp_logo_small_ico { + get { + object obj = ResourceManager.GetObject("MSNPSharp_logo_small_ico", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap nudge { + get { + object obj = ResourceManager.GetObject("nudge", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap offline { + get { + object obj = ResourceManager.GetObject("offline", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap online { + get { + object obj = ResourceManager.GetObject("online", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap open { + get { + object obj = ResourceManager.GetObject("open", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap sad { + get { + object obj = ResourceManager.GetObject("sad", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap smiley { + get { + object obj = ResourceManager.GetObject("smiley", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap tongueout { + get { + object obj = ResourceManager.GetObject("tongueout", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap wink { + get { + object obj = ResourceManager.GetObject("wink", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon yahoo_ico { + get { + object obj = ResourceManager.GetObject("yahoo_ico", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap YahooMessenger_logo { + get { + object obj = ResourceManager.GetObject("YahooMessenger_logo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Example/Properties/Resources.resx b/Example/Properties/Resources.resx new file mode 100644 index 0000000..fe10750 --- /dev/null +++ b/Example/Properties/Resources.resx @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\yahoo_ico.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\smileys\sad.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\nudge.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\MSNPSharp_logo_small.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\smileys\biggrin.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\status\away.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\msn_ico.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\status\idle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\loading.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\smileys\wink.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\status\busy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\status\hidden.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\status\online.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\file.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\status\offline.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\status\circle.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\status\closed.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\YahooMessenger_logo.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\status\open.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\smileys\tongueout.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\smileys\smiley.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\inner_emoicon.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\app_banner.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Color_fontHS.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Example/RemoveContactForm.Designer.cs b/Example/RemoveContactForm.Designer.cs new file mode 100644 index 0000000..56e6e8c --- /dev/null +++ b/Example/RemoveContactForm.Designer.cs @@ -0,0 +1,102 @@ +namespace MSNPSharpClient +{ + partial class RemoveContactForm + { + /// + /// 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() + { + this.cbRemove = new System.Windows.Forms.CheckBox(); + this.cbBlock = new System.Windows.Forms.CheckBox(); + this.btnRemove = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // cbRemove + // + this.cbRemove.AutoSize = true; + this.cbRemove.Location = new System.Drawing.Point(12, 21); + this.cbRemove.Name = "cbRemove"; + this.cbRemove.Size = new System.Drawing.Size(201, 17); + this.cbRemove.TabIndex = 0; + this.cbRemove.Text = "Remove this user from my contact list"; + this.cbRemove.UseVisualStyleBackColor = true; + // + // cbBlock + // + this.cbBlock.AutoSize = true; + this.cbBlock.Location = new System.Drawing.Point(12, 44); + this.cbBlock.Name = "cbBlock"; + this.cbBlock.Size = new System.Drawing.Size(75, 17); + this.cbBlock.TabIndex = 1; + this.cbBlock.Text = "Also block"; + this.cbBlock.UseVisualStyleBackColor = true; + // + // btnRemove + // + this.btnRemove.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnRemove.Location = new System.Drawing.Point(24, 76); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.Size = new System.Drawing.Size(99, 23); + this.btnRemove.TabIndex = 2; + this.btnRemove.Text = "Remove contact"; + this.btnRemove.UseVisualStyleBackColor = true; + this.btnRemove.Click += new System.EventHandler(this.btn_Click); + // + // btnCancel + // + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(129, 76); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(75, 23); + this.btnCancel.TabIndex = 3; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btn_Click); + // + // RemoveContactForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(217, 113); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnRemove); + this.Controls.Add(this.cbBlock); + this.Controls.Add(this.cbRemove); + this.Name = "RemoveContactForm"; + this.Text = "Remove Contact"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.CheckBox cbRemove; + private System.Windows.Forms.CheckBox cbBlock; + private System.Windows.Forms.Button btnRemove; + private System.Windows.Forms.Button btnCancel; + } +} \ No newline at end of file diff --git a/Example/RemoveContactForm.cs b/Example/RemoveContactForm.cs new file mode 100644 index 0000000..2892ab5 --- /dev/null +++ b/Example/RemoveContactForm.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MSNPSharpClient +{ + public partial class RemoveContactForm : Form + { + + public bool RemoveFromAddressBook + { + get + { + return cbRemove.Checked; + } + } + + public bool Block + { + get + { + return cbBlock.Checked; + } + } + + public RemoveContactForm() + { + InitializeComponent(); + } + + private void btn_Click(object sender, EventArgs e) + { + Close(); + } + } +} \ No newline at end of file diff --git a/Example/RemoveContactForm.resx b/Example/RemoveContactForm.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Example/RemoveContactForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Example/Resources/Color_fontHS.png b/Example/Resources/Color_fontHS.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7695d243769c25965c638299d3cea2e13e9a73 GIT binary patch literal 3205 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 literal 0 HcmV?d00001 diff --git a/Example/Resources/YahooMessenger_logo.png b/Example/Resources/YahooMessenger_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca721dcdccf663c82f4c255192b44273912c6f5 GIT binary patch literal 16050 zcma)DQ+ORrv_0{OZQE{a+qP{xIbj>yb{gAOW212zJ85H{``@SgdLL%yo45I9d#|;l zRh4Cs5eN_f006R_tfcyXC+L3{5ca=)MA&Q^03ZX%Ns4Lu=3V#sby~^j-GYBsx2^5k z2nQ)w{wnj}w}2C062l-9#n?B-lq|!C{)^xVEomvgP_tO$3Y8f4mW0Ma7Y-DIczxBN zz>tJqhEKHx(O8Bd1*JR)=DVRfR8_yrtP(s4za!-W;v^}>(|=FZN}=JQ7+H!n}bL~o15U?PnD6WYB%Il7U$ zVkB-jifx9-?HtbFvu$!TG$iN;ryEAri%6JDoXMexBh#?4rOj1}-1(Qa<$=g{e~y-o zGVTrL?8VgVS#M!*&-}pQue+FEQtGl1*k_WZWuwpt4ounvNeGP0;;L)WUdV%Z;q0(Z z-^Agglu0U_FX9T=<@Y9owx0_~uV118`^%@nZ@r?`PNBd8;)y#Ba_CYOBCE4j@+fXp zH3NfE7Z1{*L5pW!51+YYuIA|R@c8JT0+lSe8(d1SKseSTvOPY)8z3BZ&NS=4U!xh10E!5YJQ*f`89|SrOPC7irVD8 zrO%Xc5=x`tqZCilbwAPm32q9>&7XIEx%2@0b8v1bZCaCt%nCJps*n?xsR9xC7xAnb zr%cl=*br37${fCMI`(YCn_x?kH}P86ETvQJ;KGDNw&O(w`!V*rmm9Xq%DVZ}hPb)V z6l+7K{MSURgf3b26VWiDMS;-?To}<A`RfmP5<5WSFj9%@(jEXJ1|js!1$>P;+^D09>e%`M28OhXnkp=|%<;C_ zCNeS$XZ2V`VxfGlPm3EwTD_jvefG%edY|4n>j&g=uZRa8_rV`cH9&eQe(tQ9jtj$H zM#EKE1i;attNP#ugns7Cd~@7+>GHSAT!DRdZ>YWg^XpUkVrRBB!}c4yOW$Eu!Q|pq z<=)C!Bzi-}OmPY|U9%+d&_k z003-laS6B&dLoZF={)We^$Ko?`3?_a-$(iD+Khe$8Mg29D3;rO?tb3P_YtTLZ040h zh?X)hH$gB b0f?TV}}98gh7RArg*UI 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 E0QL#|9RL6T literal 0 HcmV?d00001 diff --git a/Example/Resources/file.png b/Example/Resources/file.png new file mode 100644 index 0000000000000000000000000000000000000000..c07f629f952655f2d239c64d1c014b1035692c55 GIT binary patch literal 917 zcmV;G18V$Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBU#6G=otR5(vn(tAi#Q5*;GBr@=iA}IPJlBl4^A3;J!R?vgSN~Me} zuqaA0b&(W8Pz%hKmXFd96#~svu%ZX~z?wbW(#@Hxd~8;$<V>{4D4=5~r7i(@S8sdvWch4T@?@faAmL93btU!RckV zknR_Uo)I2BHXiz4Ji4qwbbe>iZt{cWftFzg*ItYutJ1>EK@OMd8BZXHzR?hjqda}` z=#`KlG!_=GO#upo(Ps~#XPkqo%?4G|P*Bp~ZyJko38pnRT+$GzpqeR2@;@)g*ZH>(G7m5xk! zSPYHNlr2V4zZEZxm3Z1$AuVj`EkjvHF6wke$ZV8hOJNKI2!hl|8P)7=g47lkM_UMv zv=XG#^NNe_yw1Vxb_H&>WgxHlH1b=|p;~hTCm!s;#{B4@1ng02$*7Cqf+may!$6H0 zIDUTv9vRBes4qobcM)p3Zc!u~RhoQcG|I8|YOFvwhLM0>mo)*aBOqkH3*+3I5YE2k zky5n=`^#5i@7?9tUc3Y+YZFk}nTIp=GRP`6A^v>3Kk^?WE4ys8i9V~7gnv31{G4K7 z`4@+egP4SpWjIy07Y8ch=x@z>lCNkj5#aHATW3b;N8_%G@BhRrI!GkhbWF1)TTRv| r7Yngh=VSW?wL87oV0@+-)ri1f5x%Xy5|v2h00000NkvXXu0mjfJQ1EW literal 0 HcmV?d00001 diff --git a/Example/Resources/inner_emoicon.png b/Example/Resources/inner_emoicon.png new file mode 100644 index 0000000000000000000000000000000000000000..ed88b9667cc415053441b1d6fec507fb96969526 GIT binary patch literal 7142 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 z