460 lines
13 KiB
C#
460 lines
13 KiB
C#
|
using UnityEngine;
|
|||
|
using System;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
using System.Runtime.InteropServices;
|
|||
|
using YunvaIM;
|
|||
|
using AOT;
|
|||
|
|
|||
|
namespace YunvaIM
|
|||
|
{
|
|||
|
public enum CmdChannel
|
|||
|
{
|
|||
|
IM_LOGIN = 1,
|
|||
|
IM_FRIEND = 2,
|
|||
|
IM_GROUPS = 3,
|
|||
|
IM_CHAT = 4,
|
|||
|
IM_CLOUND = 5,
|
|||
|
IM_CHANNEL = 6,
|
|||
|
IM_TROOPS = 7,
|
|||
|
IM_LBS = 8,
|
|||
|
IM_TOOLS = 9,
|
|||
|
};
|
|||
|
public class InvokeEventClass
|
|||
|
{
|
|||
|
public ProtocolEnum eventType;
|
|||
|
public object dataObj;
|
|||
|
|
|||
|
public InvokeEventClass(ProtocolEnum EventType, object DataObj)
|
|||
|
{
|
|||
|
|
|||
|
eventType = EventType;
|
|||
|
dataObj = DataObj;
|
|||
|
}
|
|||
|
}
|
|||
|
public delegate void YvCallBack(CmdChannel type, uint cmdid, uint parser, uint context);
|
|||
|
|
|||
|
[StructLayout(LayoutKind.Sequential)]
|
|||
|
public class YunVaImInterface : MonoSingleton<YunVaImInterface>
|
|||
|
{
|
|||
|
public override void Init()
|
|||
|
{
|
|||
|
base.Init();
|
|||
|
if (yvCallBack == null)
|
|||
|
{
|
|||
|
yvCallBack = new YvCallBack(CallBack);
|
|||
|
}
|
|||
|
DontDestroyOnLoad(this);
|
|||
|
}
|
|||
|
private YvCallBack yvCallBack;
|
|||
|
|
|||
|
#region used by yunva callback
|
|||
|
|
|||
|
public static uint yvpacket_get_nested_parser(uint parser){
|
|||
|
return yvpacket_get_parser_object(parser);
|
|||
|
}
|
|||
|
|
|||
|
public static int parser_get_integer(uint parser, int cmdId, int index = 0)
|
|||
|
{
|
|||
|
return parser_get_integer(parser, (byte)cmdId, index);
|
|||
|
}
|
|||
|
|
|||
|
public static IntPtr parser_get_string(uint parser, int cmdId, int index = 0)
|
|||
|
{
|
|||
|
return parser_get_string(parser, (byte)cmdId, index);
|
|||
|
}
|
|||
|
|
|||
|
public static bool parser_is_empty(uint parser, int cmdId, int index = 0)
|
|||
|
{
|
|||
|
return parser_is_empty(parser, (byte)cmdId, index);
|
|||
|
}
|
|||
|
|
|||
|
public static void parser_get_object(uint parser, int cmdId, uint obj, int index = 0)
|
|||
|
{
|
|||
|
parser_get_object(parser, (byte)cmdId, obj, index);
|
|||
|
}
|
|||
|
|
|||
|
public static byte parser_get_uint8(uint parser, int cmdId, int index = 0)
|
|||
|
{
|
|||
|
return parser_get_uint8(parser, (byte)cmdId, index);
|
|||
|
}
|
|||
|
|
|||
|
public static uint parser_get_uint32(uint parser, int cmdId, int index = 0)
|
|||
|
{
|
|||
|
return (uint)parser_get_integer(parser, (byte)cmdId, index);
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
public static MyQueue eventQueue = new MyQueue();
|
|||
|
|
|||
|
public class MyQueue
|
|||
|
{
|
|||
|
|
|||
|
private Queue<InvokeEventClass> myQueue;
|
|||
|
|
|||
|
private object _lock;
|
|||
|
|
|||
|
public MyQueue()
|
|||
|
{
|
|||
|
myQueue = new Queue<InvokeEventClass>();
|
|||
|
_lock = new object();
|
|||
|
}
|
|||
|
|
|||
|
public void Enqueue(InvokeEventClass item)
|
|||
|
{
|
|||
|
lock (_lock)
|
|||
|
{
|
|||
|
myQueue.Enqueue(item);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public bool GetData(Queue<InvokeEventClass> outQ)
|
|||
|
{
|
|||
|
lock (_lock)
|
|||
|
{
|
|||
|
int count = myQueue.Count;
|
|||
|
if (count == 0)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
for (int i = 0; i < count; i++)
|
|||
|
{
|
|||
|
InvokeEventClass obj = myQueue.Dequeue();
|
|||
|
outQ.Enqueue(obj);
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#region <EFBFBD>ӿڵ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
public int InitSDK(uint context, uint appid, string path, bool isTest, bool oversea)
|
|||
|
{
|
|||
|
return YVIM_Init(CallBack, context, appid, path, isTest, oversea);
|
|||
|
}
|
|||
|
|
|||
|
public void ReleaseSDK()
|
|||
|
{
|
|||
|
YVIM_Release();
|
|||
|
}
|
|||
|
|
|||
|
public int YV_SendCmd(CmdChannel type, uint cmdid, uint parser)
|
|||
|
{
|
|||
|
return YVIM_SendCmd(type, cmdid, parser);
|
|||
|
}
|
|||
|
|
|||
|
public uint YVpacket_get_parser()
|
|||
|
{
|
|||
|
return yvpacket_get_parser();
|
|||
|
}
|
|||
|
|
|||
|
// private uint YVpacket_get_parser_object(uint parser)
|
|||
|
// {
|
|||
|
// return yvpacket_get_parser_object(parser);
|
|||
|
// }
|
|||
|
|
|||
|
public void YVparser_set_object(uint parser, byte cmdId, uint value)
|
|||
|
{
|
|||
|
parser_set_object(parser, cmdId, value);
|
|||
|
}
|
|||
|
|
|||
|
public void YVparser_set_uint8(uint parser, byte cmdId, int value)
|
|||
|
{
|
|||
|
parser_set_uint8(parser, cmdId, value);
|
|||
|
}
|
|||
|
|
|||
|
public void YVparser_set_integer(uint parser, byte cmdId, int value)
|
|||
|
{
|
|||
|
parser_set_integer(parser, cmdId, value);
|
|||
|
}
|
|||
|
|
|||
|
public void YVparser_set_string(uint parser, byte cmdId, string value)
|
|||
|
{
|
|||
|
parser_set_string(parser, cmdId, value);
|
|||
|
}
|
|||
|
|
|||
|
#if UNITY_ANDROID
|
|||
|
public void YVparser_set_string(uint parser, byte cmdId, IntPtr value)
|
|||
|
{
|
|||
|
parser_set_string (parser, cmdId, value);
|
|||
|
}
|
|||
|
#elif UNITY_EDITOR_WIN
|
|||
|
public void YVparser_set_string(uint parser, byte cmdId, IntPtr value)
|
|||
|
{
|
|||
|
parser_set_string(parser, cmdId, value);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
public void YVparser_set_buffer(uint parser, byte cmdId, IntPtr value, int len)
|
|||
|
{
|
|||
|
parser_set_buffer(parser, cmdId, value, len);
|
|||
|
}
|
|||
|
|
|||
|
// public void YVparser_get_object(uint parser, byte cmdId, uint obj, int index)
|
|||
|
// {
|
|||
|
// parser_get_object(parser, cmdId, obj, index);
|
|||
|
// }
|
|||
|
//
|
|||
|
// public byte YVparser_get_uint8(uint parser, byte cmdId, int index)
|
|||
|
// {
|
|||
|
// return parser_get_uint8(parser, cmdId, index);
|
|||
|
// }
|
|||
|
//
|
|||
|
// public int YVparser_get_integer(uint parser, byte cmdId, int index)
|
|||
|
// {
|
|||
|
// return parser_get_integer(parser, cmdId, index);
|
|||
|
// }
|
|||
|
//
|
|||
|
// public IntPtr YVparser_get_string(uint parser, byte cmdId, int index)
|
|||
|
// {
|
|||
|
// return parser_get_string(parser, cmdId, index);
|
|||
|
// }
|
|||
|
//
|
|||
|
// public bool YVparser_is_empty(uint parser, byte cmdId, int index)
|
|||
|
// {
|
|||
|
// return parser_is_empty(parser, cmdId, index);
|
|||
|
// }
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
//#if UNITY_IOS
|
|||
|
[MonoPInvokeCallback(typeof(YvCallBack))]
|
|||
|
//#endif
|
|||
|
public static void CallBack(CmdChannel type, uint cmdid, uint parser, uint context)
|
|||
|
{
|
|||
|
ArrayList list = new ArrayList();
|
|||
|
string tatal = type.ToString() + "; " + (ProtocolEnum)cmdid; //0x" + cmdid.ToString("x"); // + ";" + parser.ToString () + ";" + context.ToString ();
|
|||
|
Debug.Log("====Unity==== callback:" + tatal);
|
|||
|
YunvaMsgBase.GetMsg(cmdid, (object)parser);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public static string IntPtrToString(IntPtr intptr, bool isVR = false)
|
|||
|
{
|
|||
|
int len = 0;
|
|||
|
while (true)
|
|||
|
{
|
|||
|
byte ch = Marshal.ReadByte(intptr, len);
|
|||
|
len++;
|
|||
|
if (ch == 0)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
byte[] test = new byte[len - 1];
|
|||
|
Marshal.Copy(intptr, test, 0, len - 1);
|
|||
|
|
|||
|
//#if UNITY_EDITOR
|
|||
|
// if (isVR)
|
|||
|
// {
|
|||
|
// return Encoding.UTF8.GetString(test);
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// return Encoding.Default.GetString(test);
|
|||
|
// }
|
|||
|
//#endif
|
|||
|
|
|||
|
return Encoding.UTF8.GetString(test);
|
|||
|
}
|
|||
|
|
|||
|
// public static string IntPtrToString2(IntPtr intPtr)
|
|||
|
// {
|
|||
|
//#if UNITY_IOS
|
|||
|
// return Marshal.PtrToStringAnsi(intPtr);
|
|||
|
//#elif UNITY_ANDROID
|
|||
|
// return Marshal.PtrToStringAnsi(intPtr);
|
|||
|
//#else
|
|||
|
//
|
|||
|
// int elementSize = 1; //Marshal.SizeOf(typeof(char));
|
|||
|
// int size = 0;
|
|||
|
// while (true)
|
|||
|
// {
|
|||
|
// if (Marshal.ReadByte(intPtr, size * elementSize) == 0)
|
|||
|
// break;
|
|||
|
// size++;
|
|||
|
// }
|
|||
|
// if (size == 0)
|
|||
|
// return "";
|
|||
|
// Byte[] bytes = new Byte[size];
|
|||
|
// Marshal.Copy(intPtr, bytes, 0, size);
|
|||
|
// return System.Text.Encoding.Default.GetString(bytes);
|
|||
|
//#endif
|
|||
|
// }
|
|||
|
|
|||
|
private Queue<InvokeEventClass> tmpQ = new Queue<InvokeEventClass>();
|
|||
|
|
|||
|
void Update()
|
|||
|
{
|
|||
|
if (eventQueue.GetData(tmpQ))
|
|||
|
{
|
|||
|
while (tmpQ.Count > 0)
|
|||
|
{
|
|||
|
InvokeEventClass obj = tmpQ.Dequeue();
|
|||
|
EventListenerManager.Invoke(obj.eventType, obj.dataObj);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void OnApplicationQuit()
|
|||
|
{
|
|||
|
//YunVaImSDK.instance.YunVaLogOut();
|
|||
|
//YunVaImInterface.instance.ReleaseSDK();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#region imsdk
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("LoginSDK.dll", EntryPoint = "YVIM_Init", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern int YVIM_Init(YvCallBack callback, uint context, uint appid, string path, bool test,bool oversea);
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("LoginSDK.dll", EntryPoint = "YVIM_Release", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern void YVIM_Release();
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("LoginSDK.dll", EntryPoint = "YVIM_SendCmd", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern int YVIM_SendCmd(CmdChannel type, uint cmdid, uint parser);
|
|||
|
|
|||
|
//packet
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "yvpacket_get_parser", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern uint yvpacket_get_parser();
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "yvpacket_get_parser_object", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern uint yvpacket_get_parser_object(uint parser);
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_set_object", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern void parser_set_object(uint parser, byte cmdId, uint value);
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_set_uint8", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern void parser_set_uint8(uint parser, byte cmdId, int value);
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_set_integer", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern void parser_set_integer(uint parser, byte cmdId, int value);
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_set_string", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern void parser_set_string(uint parser, byte cmdId, string value);
|
|||
|
|
|||
|
#if UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
public static extern void parser_set_string(uint parser, byte cmdId, IntPtr value);
|
|||
|
#elif UNITY_EDITOR_WIN
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_set_string", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
private static extern void parser_set_string(uint parser, byte cmdId, IntPtr value);
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_set_buffer", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern void parser_set_buffer(uint parser, byte cmdId, IntPtr value, int len);
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_get_object", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern void parser_get_object(uint parser, byte cmdId, uint obj, int index);
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_get_uint8", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern byte parser_get_uint8(uint parser, byte cmdId, int index);
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_get_integer", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern int parser_get_integer(uint parser, byte cmdId, int index);
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_get_string", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern IntPtr parser_get_string(uint parser, byte cmdId, int index);
|
|||
|
|
|||
|
#if UNITY_IOS
|
|||
|
[DllImport("__Internal")]
|
|||
|
#elif UNITY_ANDROID
|
|||
|
[DllImport("YvImSdk")]
|
|||
|
#else
|
|||
|
[DllImport("yvpacket.dll", EntryPoint = "parser_is_empty", CallingConvention = CallingConvention.Cdecl)]
|
|||
|
#endif
|
|||
|
private static extern bool parser_is_empty(uint parser, byte cmdId, int index);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|