#ifndef __msn_util_h__ #define __msn_util_h__ /* * util.h * libmsn * * Created by Mark Rowe on Mon Mar 22 2004. * Refactored by Tiago Salem Herrmann on 08/2007. * Copyright (c) 2004 Mark Rowe. All rights reserved. * Copyright (c) 2007 Tiago Salem Herrmann. All rights reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include #ifdef _MSC_VER #pragma warning( disable : 4290 ) #endif // this is for CHL command #define szClientID "PROD0114ES4Z%Q5W" #define szClientCode "PK}_A_0N_K%O?A9S" #ifndef U8 #define U8 unsigned char #endif #ifndef U16 #define U16 unsigned short #endif #ifndef U32 #define U32 unsigned int #endif #define FB_UNI 0xFFFd // for libsiren #define RIFF_ID 0x46464952 #define WAVE_ID 0x45564157 #define FMT_ID 0x20746d66 #define DATA_ID 0x61746164 #define FACT_ID 0x74636166 typedef struct { unsigned int chunk_id; unsigned int chunk_size; } wav_data; typedef struct { unsigned int chunk_id; unsigned int chunk_size; unsigned int type_id; } riff_data; typedef struct { unsigned short format; unsigned short channels; unsigned int sample_rate; unsigned int byte_rate; unsigned short block_align; unsigned short bits_per_sample; } fmt_chunk; typedef struct { fmt_chunk fmt; unsigned short extra_size; unsigned char *extra_content; } fmt_chunk_ex; #define IDX(val, i) ((unsigned int) ((unsigned char *) &val)[i]) #define GUINT16_FROM_LE(val) ((unsigned short) (IDX (val, 0) + (unsigned short) IDX (val, 1) * 256)) #define GUINT32_FROM_LE(val) ((unsigned int) (IDX (val, 0) + IDX (val, 1) * 256 + \ IDX (val, 2) * 65536 + IDX (val, 3) * 16777216)) namespace MSN { /** URL-encode a string * * @param s The string to encode. * @return A string with all non-alphanumeric characters replaced by their * URL-encoded equivalent. */ std::string encodeURL(const std::string & s); /** URL-decode a string * * @param s The URL-encoded string to decode. * @return A string with all URL-encoded sequences replaced by their * @c ASCII equivalent. */ std::string decodeURL(const std::string & s); /** Split a string containing a hostname and port number into its respective parts. * * @param address A string in the form "hostname:port". * @param default_port A port number to return in the event that ":port" is omitted from @a address. * @return A pair containing the hostname and port number. */ std::pair splitServerAddress(const std::string & address, int default_port=1863); /** Compare two strings in a case insensitive fashion */ int nocase_cmp(const std::string & s1, const std::string & s2); /** Split @a string at each occurence of @a separator. */ std::vector splitString(const std::string & string, const std::string & separator, bool suppressBlanks=true); std::string toStr(int var); std::string unsignedToStr(unsigned int var); /** Convert a string, @a s, that contains decimal digits into an unsigned int. */ unsigned int decimalFromString(const std::string & s) throw (std::logic_error); U32 _ucs2_utf8(U8 *dst, U8 *src, U32 nchar); U32 _utf8_ucs2(U8 *dst, U8 *src); /** represents a contact pesonal message */ struct personalInfo { std::string PSM; /**< personal status message */ std::string mediaApp; /**< iTunes, Winamp or keep it empty */ std::string mediaType; /**< 'Music', 'Games' or 'Office' */ bool mediaIsEnabled; /**< enable/disable the Current Media setting */ std::string mediaFormat; /**< for example, "{0} - {1}" */ std::vector mediaLines; /**< index 0 will be {0}, etc.. */ personalInfo() { mediaIsEnabled = false; } }; struct hotmailInfo { std::string rru; std::string url; std::string id; std::string sl; std::string kv; std::string sid; std::string MSPAuth; std::string creds; }; /** Represents the lists present on server side */ typedef enum { LST_AB = 1, /**< Address book */ LST_AL = 2, /**< Allow */ LST_BL = 4, /**< Block */ LST_RL = 8, /**< Reverse */ LST_PL = 16 /**< Pending */ }ContactList; struct tagMSGRUSRKEY { unsigned int uStructHeaderSize; // 28. Does not count data unsigned int uCryptMode; // CRYPT_MODE_CBC (1) unsigned int uCipherType; // TripleDES (0x6603) unsigned int uHashType; // SHA1 (0x8004) unsigned int uIVLen; // 8 unsigned int uHashLen; // 20 unsigned int uCipherLen; // 72 // Data unsigned char aIVBytes[8]; unsigned char aHashBytes[20]; unsigned char aCipherBytes[72]; }; /** represents an offline message */ typedef struct { std::string from; /**< sender passport */ std::string fromFN; /**< sender nickname */ std::string id; /**< ID of this offline message */ } eachOIM; std::string new_branch(); std::string generate_soap_auth(std::string user, std::string pass, std::string ticket); std::string mdi_encrypt(std::string key, std::string nonce); std::string b64_decode(const char *input); std::string b64_encode(const char *input, int size); unsigned int little2big_endian(unsigned int i); int FileSize(const char* sFileName); void DoMSNP11Challenge(const char *szChallenge, char *szOutput); // stolen from kopete /** List of possible capabilities for a contact */ typedef enum { WindowsMobile = 0x1, InkGifSupport = 0x4, InkIsfSupport = 0x8, SupportWebcam = 0x10, SupportMultiPacketMessaging = 0x20, MSNMobileDevice = 0x40, MSNDirectDevice = 0x80, WebMessenger = 0x100, OtherSideWebMessenger = 0x200, InternalMicrosoftClient = 0x800, //Internal Microsoft client and/or Microsoft Office Live client. MSNSpace = 0x1000, WinXPMediaCenter = 0x2000, // This means you are using Windows XP Media Center Edition. SupportDirectIM = 0x4000, SupportWinks = 0x8000, MSNSearch = 0x10000, VoiceClips = 0x40000, SecureChannel = 0x80000, SIPInvitations = 0x100000, SharingFolders = 0x400000, MSNC1 = 0x10000000, MSNC2 = 0x20000000, MSNC3 = 0x30000000, MSNC4 = 0x40000000, MSNC5 = 0x50000000, MSNC6 = 0x60000000, MSNC7 = 0x70000000 } MSNClientInformationFields; /** Defines the file transfer type */ enum fileTransferType { FILE_TRANSFER_WITH_PREVIEW = 0x0, /**< With preview */ FILE_TRANSFER_WITHOUT_PREVIEW = 0x1, /**< Without preview */ FILE_TRANSFER_BACKGROUND_SHARING = 0x4, /**< Transfer of a sharing background */ // it is not a simple jpg file, there is a cab file inside it FILE_TRANSFER_BACKGROUND_SHARING_CUSTOM = 0xC /**< Custom and not supported by libmsn yet */ }; /** Type of the error when a file transfer fails */ enum fileTransferError { FILE_TRANSFER_ERROR_USER_CANCELED, /**< The other user canceled */ FILE_TRANSFER_ERROR_UNKNOWN /**< Unknown error */ }; /** Represents a file transfer request */ typedef struct { int type; /**< 0 = no preview, 1 = has preview, 4 = background sharing */ unsigned int sessionId; /**< Id of this session */ std::string userPassport; /**< passport of the origin or the destination */ std::string filename; /**< name the file to receive, or the path of the file to send */ std::string friendlyname; /**< suggested name <- required when sending a file */ std::string preview; /**< base64 encoded 96x96 png file, if applicable */ unsigned long long filesize; /**< size of the file to send or receive */ } fileTransferInvite; void libmsn_Siren7_DecodeVoiceClip(std::string input_file); void libmsn_Siren7_EncodeVoiceClip(std::string input_file); } #endif