using AOT;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using TEngine;
using UnityEngine;
public class KuaiShouClient : MonoBehaviour
{
///
/// �汾id
///
int version = 1;
///
/// IPC�Ƿ�����
///
public static bool IsConnect
{
get; private set;
}
// IPC·��
string IPCPath;
// ˽�˷���Code
string PreviewRoomCode;
static IntPtr ipcHandle;
public delegate void _OnDataReceived(string content, uint len, IntPtr ptr);
public delegate void _OnConnected(IntPtr ptr);
public delegate void _OnDisconnect(IntPtr ptr);
public delegate void _OnLog(string content, uint len, IntPtr ptr);
static Queue msgQueue = new Queue();
void Start()
{
Debug.Log("?!!!!!!!!!KuaiShouClient");
string[] commandLineArgs = System.Environment.GetCommandLineArgs();
var CommandLineArgs = new Dictionary();
for (int i = 0; i < commandLineArgs.Length; i++)
{
if (commandLineArgs[i] == "-c" || commandLineArgs[i] == "-pos" || commandLineArgs[i] == "-ipc")
{
CommandLineArgs[commandLineArgs[i]] = commandLineArgs[i + 1];
}
}
foreach (var item in CommandLineArgs)
{
Debug.Log(item);
}
if (CommandLineArgs.TryGetValue("-c", out string str))
{
PreviewRoomCode = str;
}
if (CommandLineArgs.TryGetValue("-ipc", out string str1))
{
IPCPath = str1;
}
IsConnect = false;
if (!string.IsNullOrEmpty(IPCPath))
{
ipcHandle = new IntPtr(GetHashCode());
IpcInterface.SetDataReceivedCallback(OnDataReceived, ipcHandle);
IpcInterface.SetConnectedCallback(OnConnected, ipcHandle);
IpcInterface.SetDisconnectCallback(OnDisconnect, ipcHandle);
IpcInterface.SetLogCallback(OnLog, ipcHandle);
int result = IpcInterface.InitIpc(IPCPath, (uint)IPCPath.Length, IpcInterface.IPC_CS_TYPE.CLIENT);
if (result == 0)
{
IsConnect = true;
//EventMgr.FireEvent(TEventType.IPCStateChange);
}
else
{
Debug.LogError("IPC result:" + result.ToString());
}
}
}
// Update is called once per frame
void Update()
{
// lock (msgQueue)
{
if (msgQueue.Count > 0)
{
while (msgQueue.Count > 0)
{
ParseMsg(msgQueue.Dequeue());
}
}
}
}
///
/// �������·���Ϣ
///
///
void ParseMsg(string content)
{
Dictionary msg = JsonConvert.DeserializeObject>(content);
if (msg != null)
{
if (msg.TryGetValue("type", out var t))
{
Debug.Log("type:" + t);
}
Dictionary data = null;
if (msg.TryGetValue("data", out var d))
{
data = JsonConvert.DeserializeObject>(d.ToString());
}
switch (t)
{
case "SC_SET_CODE":
if (data != null && data.TryGetValue("code", out var code))
{
Debug.Log("SC_SET_CODE code:" + code.ToString());
string oldCode = PreviewRoomCode;
PreviewRoomCode = code.ToString();
GameEvent.Send("SetRoomId", PreviewRoomCode);
}
break;
case "SC_QUIT":
if (data != null && data.TryGetValue("message", out var message))
{
Debug.Log("SC_QUIT msg:" + message);
}
Application.Quit();
break;
default:
break;
}
}
}
public void SendMsg(string msgType, Dictionary msgData)
{
if (ipcHandle != IntPtr.Zero)
{
Dictionary data = new Dictionary()
{
{ "type" ,msgType },
{ "data" , msgData },
{ "version" , version }
};
string msg = JsonUtility.ToJson(data);
int result = IpcInterface.SendData(msg, (uint)msg.Length);
if (result == -1)
{
Debug.LogError("IPC��Ϣ����ʧ�ܣ�");
}
}
else
{
Debug.LogError("IPC ��ʼ��ʧ��");
}
}
///
/// �յ�����
///
///
///
///
[MonoPInvokeCallback(typeof(_OnDataReceived))]
static void OnDataReceived(IntPtr contentPtr, uint len, IntPtr ptr)
{
string content = Marshal.PtrToStringUTF8(contentPtr, (int)len);
if (string.IsNullOrEmpty(content))
{
Debug.Log("ipc call func : OnDataReceived ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString() + " len" + len.ToString() + " content: is null or empty");
return;
}
Debug.Log("ipc call func : OnDataReceived ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString() + " len" + len.ToString() + " content:" + content);
if (ptr == ipcHandle)
{
// lock (msgQueue)
// {
msgQueue.Enqueue(content);
// }
}
else
{
Debug.LogError("ipc call func : OnDataReceived ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString() + " len" + len.ToString() + " content:" + content + " 不匹配");
}
}
///
/// ����
///
///
[MonoPInvokeCallback(typeof(_OnConnected))]
static void OnConnected(IntPtr ptr)
{
Debug.Log("ipc call func : OnConnected ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString());
if (ptr == ipcHandle)
{
Debug.Log("ipc conneted");
IsConnect = true;
//EventMgr.FireEvent(TEventType.IPCStateChange);
}
}
///
/// �Ͽ�����
///
///
[MonoPInvokeCallback(typeof(_OnDisconnect))]
static void OnDisconnect(IntPtr ptr)
{
// Debug.Log("ipc call func : OnDisconnect ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString());
if (ptr == ipcHandle)
{
IsConnect = false;
//EventMgr.FireEvent(TEventType.IPCStateChange);
Debug.Log(message: "ipc disconneted");
//�Ͽ����Ӻ��Զ��ر���Ϸ
Application.Quit();
}
}
///
/// �յ���־
///
///
///
///
[MonoPInvokeCallback(typeof(_OnLog))]
static void OnLog(IntPtr contentPtr, uint len, IntPtr ptr)
{
string content = Marshal.PtrToStringUTF8(contentPtr, (int)len);
// Debug.Log("ipc call func : OnLog ptr:" + ptr.ToString() + " curPtr:" + ipcHandle.ToString() + " len" + len.ToString() + " content:" + content);
//if (ptr == ipcHandle)
//{
// Debug.Log("ipc log:" + content);
//}
}
///
/// �ͷ�ipc��Ϣ
///
public void ReleaseIPC()
{
if (ipcHandle != IntPtr.Zero)
{
ipcHandle = IntPtr.Zero;
IpcInterface.ReleaseIpc();
}
}
private void OnDestroy()
{
ReleaseIPC();
}
}