[代码分享] 在Windows Mobile上监听Radio Interface Layer Notification(另一个实现)
[CODE]
//---------------------------------------------------------------------------
// <copyright file="RILHelper.cs" company="Yaping Xin">
// Copyright (c) Yaping Xin. All rights reserved.
// </copyright>
// <Description>Helper class for Radio Interface Layer.</Description>
//---------------------------------------------------------------------------
namespace MobileAutomation.Projects.VDFStressTesting
{
using System;
using System.Runtime.InteropServices;
using System.Threading;
/// <summary>
/// Helper class for Radio Interface Layer.
/// </summary>
public class RILHelper
{
/// <summary>
/// Delegation definition of Log event handler
/// </summary>
/// <param name="message">Message to transfer</param>
public delegate void LogHandler(string message);
/// <summary>Event handler to record log</summary>
public static event LogHandler Log;
/// <summary>AutoResetEvent object</summary>
private static AutoResetEvent waithandle = new AutoResetEvent(false);
/// <summary>HRESULT to RIL object</summary>
private static IntPtr hRil = IntPtr.Zero;
/// <summary>HRESULT to result</summary>
private static IntPtr hRes = IntPtr.Zero;
/// <summary>
/// RILRESULTCALLBACK delegation
/// http://msdn.microsoft.com/en-us/library/aa920069.aspx
/// </summary>
/// <param name="dwCode">Specifies the result code.</param>
/// <param name="hrCmdID">ID returned by the command that originated this response.</param>
/// <param name="lpData">Data associated with the notification.</param>
/// <param name="cbData">Size of the structure pointed to by lpData.</param>
/// <param name="dwParam">Specifies the parameter passed to RIL_Initialize or RIL_InitializeEmergency.</param>
public delegate void RILRESULTCALLBACK(
uint dwCode,
IntPtr hrCmdID,
IntPtr lpData,
uint cbData,
uint dwParam);
/// <summary>
/// RILNOTIFYCALLBACK delegation
/// http://msdn.microsoft.com/en-us/library/aa922465.aspx
/// </summary>
/// <param name="dwCode">Specifies the notification code. </param>
/// <param name="lpData">Data associated with the notification.</param>
/// <param name="cbData">Size of the structure pointed to by lpData.</param>
/// <param name="dwParam">Specifies the parameter passed to RIL_Initialize or RIL_InitializeEmergency.</param>
public delegate void RILNOTIFYCALLBACK(
uint dwCode,
IntPtr lpData,
uint cbData,
uint dwParam);
/// <summary>
/// RIL Initialize
/// </summary>
/// <returns>RIL HRESULT</returns>
public static IntPtr Initialize()
{
return RIL_Initialize(1, new RILRESULTCALLBACK(RilResultCallback), new RILNOTIFYCALLBACK(RilNotifyCallback), 0xffffffff, 0, out hRil);
}
/// <summary>
/// RIL Deinitialize
/// </summary>
/// <returns>RIL HRESULT</returns>
public static IntPtr Deinitialize()
{
return RIL_Deinitialize(hRil);
}
/// <summary>
/// Retrieves the system time from the network.
/// </summary>
/// <returns>Positive HRESULT values</returns>
public static IntPtr GetSystemTime()
{
return RIL_GetSystemTime(hRil);
}
/// <summary>
/// RIL Reslt Callback Proc
/// </summary>
/// <param name="dwCode">Specifies the result code.</param>
/// <param name="hrCmdID">ID returned by the command that originated this response.</param>
/// <param name="lpData">Data associated with the notification.</param>
/// <param name="cbData">Size of the structure pointed to by lpData.</param>
/// <param name="dwParam">Specifies the parameter passed to RIL_Initialize or RIL_InitializeEmergency.</param>
public static void RilResultCallback(
uint dwCode,
IntPtr hrCmdID,
IntPtr lpData,
uint cbData,
uint dwParam)
{
RIL_NCLASS dwClass = (RIL_NCLASS)dwCode & RIL_NCLASS.ALL;
string message = string.Format("ResultCallback - dwCode: {0}, RIL_NCLASS: {1}", dwCode, dwClass);
RILHelper.OnLog(message);
waithandle.Set();
}
/// <summary>
/// RIL Notify Callback Proc
/// </summary>
/// <param name="dwCode">Specifies the notification code. </param>
/// <param name="lpData">Data associated with the notification.</param>
/// <param name="cbData">Size of the structure pointed to by lpData.</param>
/// <param name="dwParam">Specifies the parameter passed to RIL_Initialize or RIL_InitializeEmergency.</param>
public static void RilNotifyCallback(
uint dwCode,
IntPtr lpData,
uint cbData,
uint dwParam)
{
RIL_NCLASS dwClass = (RIL_NCLASS)dwCode & RIL_NCLASS.ALL;
string message = string.Format("NotifyCallback - dwCode: {0}, RIL_NCLASS: {1}", dwCode, dwClass);
RILHelper.OnLog(message);
waithandle.Set();
}
/// <summary>
/// Record the message
/// </summary>
/// <param name="message">Message to transfer</param>
protected static void OnLog(string message)
{
if (RILHelper.Log != null)
{
RILHelper.Log(message);
}
}
[DllImport("ril.dll")]
private static extern IntPtr RIL_Initialize(
uint dwIndex,
RILRESULTCALLBACK pfnResult,
RILNOTIFYCALLBACK pfnNotify,
uint dwNotificationClasses,
uint dwParam,
out IntPtr lphRil);
[DllImport("ril.dll")]
private static extern IntPtr RIL_Deinitialize(IntPtr hRil);
[DllImport("ril.dll")]
private static extern IntPtr RIL_GetSystemTime(IntPtr hRil);
}
}
[/CODE]