using namespace System;

     using namespace System::ComponentModel;

     using namespace System::Collections;

     using namespace System::Windows::Forms;

     using namespace System:咧嘴笑脸ata;

     using namespace System:咧嘴笑脸rawing;

     using namespace System::IO;

     using namespace System::Text;

     using namespace System::Runtime::InteropServices;

     using System::Net:困惑的笑脸ockets::NetworkStream;

     using System::Net:困惑的笑脸ockets::TcpClient;

     using System::IO:困惑的笑脸treamReader;

     using namespace System::Net;

     __gc public class MsnLib

     {

     public:

         MsnLib(void)

              : m_pServer(NULL)

              , m_pNs(NULL)

         {

         }

 

        

     protected:

                  

     private:

         /// <summary>

         /// 必需的设计器变量。

         /// </summary>

        

         /// <summary>

         /// 设计器支持所需的方法 - 不要用代码编辑器

         ///修改此方法的内容。

         /// </summary>        

     public:

 

         // 根据指定的服务器的地址和端口访问MSN 的服务器

         int ConnectMsnServer(String* sMsnServerName, int iMsnPort)

         {

              m_pServer = new TcpClient(sMsnServerName,iMsnPort);

              return 0;

         }

         int ConnectMsnServer(String* sMsnServerName)

         {

              //这种连接是将服务器地址和段口绑定

              String* split[] = 0;

              String *strDelimeter=":";

              split=sMsnServerName->Split(strDelimeter->ToCharArray());

              sMsnServerName=split[0];

              int iMsnPort=Convert::ToInt16(split[1]);

 

 

              m_pServer = new TcpClient(sMsnServerName,iMsnPort);

              return 0;

         }

 

         // 代表当前连接的服务器的句柄

         TcpClient* m_pServer;

 

         // MSN服务器发送协议中规定的命令控制字

         String* SendMsnCmd(String* sCmd)

         {

              StreamReader   * m_RdStrm;

              String *sData;

              unsigned char  sendbytes __gc[];

              m_pNs = m_pServer->GetStream();

              m_RdStrm = new StreamReader(m_pServer->GetStream());

              sData=sCmd->Format("{0}\r\n",sCmd);

              sendbytes = ConvertToChar(sData);   

              m_pNs->Write(sendbytes, 0, sendbytes->get_Length());

              sData=m_RdStrm->ReadLine();

              return sData;

         }

         //将字符串转换为 Byte

         unsigned char ConvertToChar(String* str) __gc[]

         {

              IntPtr   pPtr;

              int len = 0;

              unsigned char  sendbytes __gc[];

 

              len = str->get_Length();

              sendbytes = new unsigned char __gc[len];

              pPtr= Marshal:困惑的笑脸tringToHGlobalAnsi(str).ToPointer();   

              Marshal::Copy(pPtr, sendbytes, 0,len);

              Marshal::FreeHGlobal(pPtr);

 

              return (sendbytes);

         }

         // TCP进行读取的流变量

         NetworkStream* m_pNs;

 

 

         // 得到SSL字符串

         String* getSSLString(String *sPassportName)

         {

              //USR 3 TWN I example@passport.com

              String* sCmd="";

              String* sData="";

              sCmd=sCmd->Format("USR 3 TWN I {0}",sPassportName);

              sData=SendMsnCmd(sCmd);

              String *sRet=sData->Substring(0,3);

              sRet=sRet->Trim();

              if(sRet->Equals("XFR"))

              {

                   //说明当前的登录服务器无法应答,需要更换服务器

                       String* split[] = 0;

                       String *strDelimeter=" ";

                       split=sData->Split(strDelimeter->ToCharArray());

                       sData=split[3];

                       return sData;

              }

              String* split[] = 0;

              String *strDelimeter=" ";

              split=sData->Split(strDelimeter->ToCharArray());

              sData=split[4];

              return sData;

         }

 

         // 根据Passport和密码以及SSL加密字符串得到登录返回

         String* getPassport(String * sPassportName, String * password, String * sSSLString)

         {

              // Create a new 'Uri' object with the specified string.

              Uri* myUri = new Uri(S"https://nexus.passport.com/rdr/pprdr.asp");

              // Create a new request to the above mentioned URL.

              WebRequest* myWebRequest= WebRequest::Create(myUri);

              // Assign the response object of 'WebRequest' to a 'WebResponse' variable.

              WebResponse* myWebResponse = myWebRequest->GetResponse();

             

              WebHeaderCollection *webcollect= myWebResponse->get_Headers();

              String *sPassportUrlCollection[]=webcollect->GetValues("PassportURLs");

              String* split[] = 0;

              String *strDelimeter=",";

              split=sPassportUrlCollection[0]->Split(strDelimeter->ToCharArray());

              String *sPassportUri=split[1];

              sPassportUri=sPassportUri->Replace("DALogin=","https://");

 

              HttpWebRequest* myReq =

                   dynamic_cast<HttpWebRequest*>(WebRequest::Create(sPassportUri));

              String *sAuthor="";

              sAuthor=sAuthor->Format("Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in={0},pwd={1},{2}",sPassportName,password,sSSLString);

              myReq->Headers->Add("Authorization",sAuthor);

              try{

              HttpWebResponse* myHttpWebResponse =

                   dynamic_cast<HttpWebResponse*>(myReq->GetResponse());  

              if(myHttpWebResponse->StatusCode==HttpStatusCode::OK){

                   //说明获取Key成功

                   webcollect= myHttpWebResponse->get_Headers();

                   String *sKey[]=webcollect->GetValues("Authentication-Info");

                   split=sKey[0]->Split(strDelimeter->ToCharArray());

                   String *sKeyString=split[4];

                   strDelimeter="'";

                   split=sKeyString->Split(strDelimeter->ToCharArray());

                   sKeyString=split[1];

                   return sKeyString;

              }

              return "null";

              }

              catch(WebException  *e)

              {

                   String *err=e->ToString();

                   return "null";

              }

         }

 

         void DisConnect(void)

         {

              m_pServer->Close();

         }

};