/// <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)); }
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); } }
/// <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)); }
/// <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); }
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); }
/// <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)); }