示例#1
0
        /// <summary>
        /// 固定長のリクエストを送信し、レスポンスのポインタを返す
        /// </summary>
        /// <param name="url">接続先パス</param>
        /// <param name="id">ProfileID</param>
        /// <param name="request">リクエストデータ</param>
        /// <param name="outPtr">レスポンスを指したポインタ</param>
        /// <param name="outSize">レスポンスサイズ</param>
        internal void Session(string url, int id, object request, out IntPtr outPtr, out uint outSize)
        {
            uint   realSize = 0;
            IntPtr ptr      = Marshal.AllocCoTaskMem(Marshal.SizeOf(request));

            Marshal.StructureToPtr(request, ptr, false);

            try
            {
                lock (this)
                {
                    EncSession.DWC_EncSessionGetAsync(url, id, ptr, (uint)Marshal.SizeOf(request), 0);
                    if (!WaitForResponse())
                    {
                        throw new Exception("HTTPエラー");
                    }
                    outPtr = EncSession.DWC_EncSessionGetResponse(ref realSize);
                }
            }
            finally
            {
                Marshal.FreeCoTaskMem(ptr);
            }
            outSize = realSize;
            //MessageBox.Show("PTR: " + resultPtr + " size : " + realSize + " send size: " + Marshal.SizeOf(request));
        }
示例#2
0
        protected bool WaitForResponse()
        {
            DWC_END_SESSION_STATE state;

            while (true)
            {
                state = (DWC_END_SESSION_STATE)EncSession.DWC_EncSessionProcess();

                switch (state)
                {
                case DWC_END_SESSION_STATE.COMPLETED:                   //!< 完了
                    return(true);

                case DWC_END_SESSION_STATE.CANCELED:                    //!< キャンセル
                case DWC_END_SESSION_STATE.ERROR:                       //!< エラー発生
                    return(false);

                case DWC_END_SESSION_STATE.INITIAL:             //!< 初期状態
                case DWC_END_SESSION_STATE.INITIALIZED:         //!< 初期化後
                case DWC_END_SESSION_STATE.REQUEST:             //!< リクエスト発行
                case DWC_END_SESSION_STATE.GETTING_TOKEN:       //!< トークン取得中
                case DWC_END_SESSION_STATE.GOT_TOKEN:           //!< トークン取得完了
                case DWC_END_SESSION_STATE.SENDING_DATA:        //!< データ送信中
                    break;
                }
                Thread.Sleep(10);
            }
        }
示例#3
0
 /// <summary>
 /// 接続先サーバ、ディレクトリを切り替える。前回と同じサーバを指定したときは接続し直す。
 /// </summary>
 /// <param name="server">接続先サーバ</param>
 /// <param name="_key">シークレットキー</param>
 /// <returns>プロキシサーバフォーマットが正しいか</returns>
 internal bool ChangeServer(DWC_ENC_SERVER server, string _key)
 {
     currentServer = server;
     key           = _key;
     EncSession.DWC_EncSessionShutdown();
     return(EncSession.DWC_EncSessionInitializeWithProxy((int)server, key, proxyServer));
 }
示例#4
0
 /// <summary>
 /// GameSpyバックエンドとの通信を初期化する
 /// </summary>
 /// <param name="server">接続先サーバ</param>
 /// <param name="_key">ゲームごとに異なるシークレットキー</param>
 internal EncSession(DWC_ENC_SERVER server, string _key, string _proxyServer)
 {
     currentServer = server;
     key           = _key;
     proxyServer   = _proxyServer;
     EncSession.DWC_EncSessionInitializeWithProxy((int)server, key, proxyServer);
 }
示例#5
0
 protected static bool DWC_EncSessionInitializeWithProxy(int server, string initdata, string proxyServer)
 {
     DWC_EncSessionInitialize(server, initdata);
     if (proxyServer != null && proxyServer != "")
     {
         return(EncSession.DWC_EncSetProxy(proxyServer));
     }
     return(true);
 }
示例#6
0
        /// <summary>
        /// 可変長のリクエストを送信し、レスポンスのポインタを返す
        /// </summary>
        /// <param name="url">接続先パス</param>
        /// <param name="id">ProfileID</param>
        /// <param name="inPtr">リクエストを格納したbyte列</param>
        /// <param name="outPtr">レスポンスを指したポインタ</param>
        /// <param name="outSize">レスポンスサイズ</param>
        internal void Session(string url, int id, byte[] bytes, out IntPtr outPtr, out uint outSize)
        {
            uint   realSize = 0;
            int    inSize   = 0;
            IntPtr inPtr    = new IntPtr();

            if (bytes == null || bytes.Length == 0)
            {
                //throw new Exception("入力データが空です。");
            }
            else
            {
                inSize = Marshal.SizeOf(bytes[0]) * bytes.Length;
                inPtr  = Marshal.AllocHGlobal(inSize);
            }

            try
            {
                if (bytes.Length != 0)
                {
                    Marshal.Copy(bytes, 0, inPtr, bytes.Length);
                }

                lock (this)
                {
                    EncSession.DWC_EncSessionGetAsync(url, id, inPtr, (uint)inSize, 0);
                    if (!WaitForResponse())
                    {
                        throw new Exception("HTTPエラー");
                    }
                    outPtr = EncSession.DWC_EncSessionGetResponse(ref realSize);
                }
            }
            finally
            {
                Marshal.FreeHGlobal(inPtr);
            }

            outSize = realSize;
            //MessageBox.Show("PTR: " + resultPtr + " size : " + realSize + " send size: " + Marshal.SizeOf(request));
        }