in ScpService/Ds3Service.cs [138:219]
private int ServiceControlHandler(int control, int type, IntPtr data, IntPtr context)
{
switch (control)
{
case ScpDevice.SERVICE_CONTROL_STOP:
case ScpDevice.SERVICE_CONTROL_SHUTDOWN:
Stop();
break;
case ScpDevice.SERVICE_CONTROL_POWEREVENT:
switch (type)
{
case ScpDevice.PBT_APMSUSPEND:
Log.Info("Scp DS3 Service Suspending");
rootHub.Suspend();
break;
case ScpDevice.PBT_APMRESUMEAUTOMATIC:
Log.Info("Scp DS3 Service Resuming");
_mTimer.Change(10000, Timeout.Infinite);
break;
}
break;
case ScpDevice.SERVICE_CONTROL_DEVICEEVENT:
switch (type)
{
case ScpDevice.DBT_DEVICEARRIVAL:
case ScpDevice.DBT_DEVICEREMOVECOMPLETE:
ScpDevice.DEV_BROADCAST_HDR hdr;
hdr =
(ScpDevice.DEV_BROADCAST_HDR)
Marshal.PtrToStructure(data, typeof(ScpDevice.DEV_BROADCAST_HDR));
if (hdr.dbch_devicetype == ScpDevice.DBT_DEVTYP_DEVICEINTERFACE)
{
ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M deviceInterface;
deviceInterface =
(ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M)
Marshal.PtrToStructure(data, typeof(ScpDevice.DEV_BROADCAST_DEVICEINTERFACE_M));
var Class = "{" + new Guid(deviceInterface.dbcc_classguid).ToString().ToUpper() + "}";
var path = new string(deviceInterface.dbcc_name);
path = path.Substring(0, path.IndexOf('\0')).ToUpper();
var pad = rootHub.Notify((ScpDevice.Notified)type, Class, path);
if (pad != DsPadId.None)
{
if (rootHub.Pairable && !rootHub.BluetoothHostAddress.Equals(rootHub.Pads[(byte)pad].HostAddress))
{
if(rootHub.Pads[(byte)pad].Pair(rootHub.BluetoothHostAddress))
{
Log.InfoFormat("Paired DualShock Device {0} to Bluetooth host {1}",
rootHub.Pads[(byte) pad].DeviceAddress, rootHub.BluetoothHostAddress);
}
else
{
Log.ErrorFormat("Couldn't pair DualShock Device {0} to Bluetooth host {1}",
rootHub.Pads[(byte) pad].DeviceAddress, rootHub.BluetoothHostAddress);
}
}
}
}
break;
}
break;
}
return 0; // NO_ERROR
}