Ejemplo n.º 1
0
        //----------------
        /// <summary>
        /// Attempt to create a Bluetooth UUID from user input either in 128-bit
        /// UUID form or integer short-form.
        /// </summary>
        /// <param name="line">The user input.</param>
        /// <param name="result"></param>
        /// <returns><see langword="true"/> if a valid UUID was input,
        /// <see langword="false"/> otherwise.
        /// </returns>
        protected bool BluetoothService_TryParseIncludingShortForm(string line, out Guid result)
        {
            if (Guid_TryParse(line, out result))
            {
                return(true);
            }
            UInt32 u32;

#if !NETCF
            if (UInt32.TryParse(line, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                                out u32))
            {
                result = BluetoothService.CreateBluetoothUuid(u32);
                return(true);
            }
            return(false);
#else
            try {
                u32 = UInt32.Parse(line, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
            } catch (FormatException) {
                return(false);
            }
            result = BluetoothService.CreateBluetoothUuid(u32);
            return(true);
#endif
        }
Ejemplo n.º 2
0
        public void PdlNonHackProtocolId_Avctp()
        {
            //const UInt16 SvcClass16Avcrp = 0x110E;
            const UInt16 SvcClass16AvcrpController_ = 0x110F;
            Guid         SvcClass128AvcrpController = BluetoothService.CreateBluetoothUuid(SvcClass16AvcrpController_);
            //
            const UInt16 SvcClass16ProtocolL2CAP = 0x0100;
            //Debug_Assert_CorrectShortUuid(SvcClass16ProtocolL2CAP, BluetoothService.L2CapProtocol);
            const UInt16 SvcClass16ProtocolAvctp = 0x0017;
            //Debug_Assert_CorrectShortUuid(SvcClass16ProtocolAvctp, BluetoothService.AvctpProtocol);
            //
            const UInt16 PsmAvcrp = 0x0017;
            //const UInt16 PsmAvcrpBrowsing = 0x001B;
            //
            const UInt16 Version = 0x0103; // 1.3.......
            //
            var layer0 = new ServiceElement(ElementType.ElementSequence,
                                            new ServiceElement(ElementType.Uuid16, SvcClass16ProtocolL2CAP),
                                            new ServiceElement(ElementType.UInt16, PsmAvcrp));
            var layer1 = new ServiceElement(ElementType.ElementSequence,
                                            new ServiceElement(ElementType.Uuid16, SvcClass16ProtocolAvctp),
                                            new ServiceElement(ElementType.UInt16, Version));
            ServiceElement pdl = new ServiceElement(ElementType.ElementSequence,
                                                    layer0, layer1);

            ServiceRecord record = new ServiceRecord(
                new ServiceAttribute(UniversalAttributeId.ProtocolDescriptorList, pdl));

            DumpCompleteThirdPartyRecords.DoTestSmart(PdlNonHackProtocolId_Dump, record);
        }
        public void FromUuid_AgHandfree()
        {
            Type enumClass = new GiveAccess_SdpClassToAttributeIdList().GetAttributeIdEnumType(
                BluetoothService.CreateBluetoothUuid(0x111F));

            Assert.IsNotNull(enumClass);
            Assert.AreEqual("HandsFreeProfileAttributeId", enumClass.Name);
        }
        public void FromUuid_Opp()
        {
            Type enumClass = new GiveAccess_SdpClassToAttributeIdList().GetAttributeIdEnumType(
                BluetoothService.CreateBluetoothUuid(0x1105));

            Assert.IsNotNull(enumClass);
            Assert.AreEqual("ObexAttributeId", enumClass.Name);
        }
        private static ServiceRecord CreateAVariousRecord()
        {
            MyFunc <ElementType, ServiceAttributeId> createId = delegate(ElementType etX) {
                return((ServiceAttributeId)0x4000 + checked ((byte)etX));
            };
            ServiceRecordBuilder bldr = new ServiceRecordBuilder();

            bldr.AddServiceClass(BluetoothService.HealthDevice);
            bldr.ServiceName = "alan";
            IList <ServiceAttribute> attrList = new List <ServiceAttribute>();
            ElementType et_;

#if SUPPORT_NIL
            et_ = ElementType.Nil;
            attrList.Add(new ServiceAttribute(createId(et_), new ServiceElement(et_, null)));
#endif
            et_ = ElementType.Boolean;
            attrList.Add(new ServiceAttribute(createId(et_), new ServiceElement(et_, true)));
            ElementType[] weee =
            {
                ElementType.UInt8, ElementType.UInt16, ElementType.UInt32, //UInt64, UInt128,
                ElementType.Int8,  ElementType.Int16, ElementType.Int32,   //Int64, Int128,
            };
            foreach (ElementType et in weee)
            {
                attrList.Add(new ServiceAttribute(
                                 createId(et),
                                 ServiceElement.CreateNumericalServiceElement(et, (uint)et)));
            }
            et_ = ElementType.Uuid16;
            attrList.Add(new ServiceAttribute(createId(et_),
                                              new ServiceElement(et_, (UInt16)et_)));
            et_ = ElementType.Uuid32;
            attrList.Add(new ServiceAttribute(createId(et_),
                                              new ServiceElement(et_, (UInt32)et_)));
            et_ = ElementType.Uuid128;
            attrList.Add(new ServiceAttribute(createId(et_),
                                              new ServiceElement(et_, BluetoothService.CreateBluetoothUuid((int)et_))));
            bldr.AddCustomAttributes(attrList);
            bldr.AddCustomAttributes(ElementsAndVariableAndFixedInDeepTree1());
            ServiceRecord record = bldr.ServiceRecord;
            return(record);
        }
Ejemplo n.º 6
0
        public Guid GetValueAsUuid()
        {
            if (m_etd != ElementTypeDescriptor.Uuid)
            {
                throw new InvalidOperationException(ErrorMsgNotUuidType);
            }
            //
            Guid result;

            if (m_type == ElementType.Uuid16)
            {
                result = BluetoothService.CreateBluetoothUuid((UInt16)Value);
                return(result);
            }
            else if (m_type == ElementType.Uuid32)
            {
                result = BluetoothService.CreateBluetoothUuid((UInt32)Value);
                return(result);
            }
            else
            {
                return((Guid)Value);
            }
        }
Ejemplo n.º 7
0
        internal static ServiceRecord CreateServiceRecord(ref Structs.BtSdkRemoteServiceAttrStru attrs, IBluesoleilApi api)
        {
            ServiceRecordBuilder bldr = new ServiceRecordBuilder();
            //--
            Guid sc = BluetoothService.CreateBluetoothUuid(attrs.svc_class);

            bldr.AddServiceClass(sc);
            //--
            string name = ParseServiceName(ref attrs);

            if (name.Length != 0)
            {
                bldr.ServiceName = name;
            }
            //
            byte?port   = null;
            var  extras = new List <ServiceAttribute>();

            Debug.Assert(attrs.status == 0, "attrs.status: 0x" + attrs.status.ToString("X"));
            if (attrs.ext_attributes != IntPtr.Zero)
            {
                if (sc == BluetoothService.HumanInterfaceDevice)
                {
                    var hidInfo = (Structs.BtSdkRmtHidSvcExtAttrStru_HACK)Marshal.PtrToStructure(
                        attrs.ext_attributes, typeof(Structs.BtSdkRmtHidSvcExtAttrStru_HACK));
                    Debug.Assert(Marshal.SizeOf(typeof(Structs.BtSdkRmtHidSvcExtAttrStru_HACK))
                                 == Marshal.SizeOf(hidInfo), "SizeOf x2");
                    Debug.Assert(hidInfo.size == Marshal.SizeOf(typeof(Structs.BtSdkRmtHidSvcExtAttrStru_HACK))
                                 + Structs.BtSdkRmtHidSvcExtAttrStru_HACK.StackMiscountsPaddingSize,
                                 "Different sizes!  hidInfo.size: " + hidInfo.size + ", SizeOf(): " + Marshal.SizeOf(typeof(Structs.BtSdkRmtHidSvcExtAttrStru_HACK)));
                    // TO-DO Human Interface (HID) record: Use "mask" field, it's undocumented, check for real life values
                    // With test SdpCreateAHumanInputDeviceRecordsAllTwoOfThree
                    // which adds two out of three of {DeviceReleaseNumber,DeviceSubclass,CountryCode}
                    // mask==0.  So mask apparently applies to other fields!
                    // So we check these three values for zero
                    // and discard them if so!
                    Debug.WriteLine(string.Format(CultureInfo.InvariantCulture,
                                                  "HID.mask: {0:X}", hidInfo.mask));
                    var list = new List <ServiceAttribute>();
                    if (hidInfo.deviceReleaseNumber != 0)
                    {
                        list.Add(
                            new ServiceAttribute(HidProfileAttributeId.DeviceReleaseNumber,
                                                 new ServiceElement(ElementType.UInt16, hidInfo.deviceReleaseNumber)));
                    }
                    if (hidInfo.deviceSubclass != 0)
                    {
                        list.Add(
                            new ServiceAttribute(HidProfileAttributeId.DeviceSubclass,
                                                 new ServiceElement(ElementType.UInt8, hidInfo.deviceSubclass)));
                    }
                    if (hidInfo.countryCode != 0)
                    {
                        list.Add(
                            new ServiceAttribute(HidProfileAttributeId.CountryCode,
                                                 new ServiceElement(ElementType.UInt8, hidInfo.countryCode)));
                    }
                    // TO-DO HID other...
                    extras.AddRange(list);
                }
                else if (sc == BluetoothService.PnPInformation)
                {
                    var deviceInfo = (Structs.BtSdkRmtDISvcExtAttrStru)Marshal.PtrToStructure(
                        attrs.ext_attributes, typeof(Structs.BtSdkRmtDISvcExtAttrStru));
                    Debug.Assert(Marshal.SizeOf(typeof(Structs.BtSdkRmtDISvcExtAttrStru))
                                 == Marshal.SizeOf(deviceInfo), "SizeOf x2");
                    Debug.Assert(deviceInfo.size == Marshal.SizeOf(typeof(Structs.BtSdkRmtDISvcExtAttrStru))
                                 + Structs.BtSdkRmtDISvcExtAttrStru.StackMiscountsPaddingSize,
                                 "Different sizes!  deviceInfo.size: " + deviceInfo.size + ", Marshal.SizeOf: " + Marshal.SizeOf(typeof(Structs.BtSdkRmtDISvcExtAttrStru)));
                    // TO-DO Device Info (PnP) record: Use "mask" field, it's undocumented, check for real life values
                    //Debug.Assert(deviceInfo.mask == 0, "Is mask field in BtSdkRmtDISvcExtAttrStru ever set!!!, is here:" + deviceInfo.mask);
                    Debug.WriteLine(string.Format(CultureInfo.InvariantCulture,
                                                  "PnP/DI.mask: {0:X}", deviceInfo.mask));
                    // Like above (PnP) we see mask==0 for the fields we handle
                    // here (six of).  So we check these values
                    // for zero and discard them if so!
                    var list = new List <ServiceAttribute>();
                    if (deviceInfo.spec_id != 0)
                    {
                        list.Add(
                            new ServiceAttribute(DeviceIdProfileAttributeId.SpecificationId,
                                                 new ServiceElement(ElementType.UInt16, deviceInfo.spec_id)));
                    }
                    if (deviceInfo.vendor_id != 0)
                    {
                        list.Add(
                            new ServiceAttribute(DeviceIdProfileAttributeId.VendorId,
                                                 new ServiceElement(ElementType.UInt16, deviceInfo.vendor_id)));
                    }
                    if (deviceInfo.product_id != 0)
                    {
                        list.Add(
                            new ServiceAttribute(DeviceIdProfileAttributeId.ProductId,
                                                 new ServiceElement(ElementType.UInt16, deviceInfo.product_id)));
                    }
                    if (deviceInfo.version != 0)
                    {
                        list.Add(
                            new ServiceAttribute(DeviceIdProfileAttributeId.Version,
                                                 new ServiceElement(ElementType.UInt16, deviceInfo.version)));
                    }
                    if (true /* Zero means False here!! */)
                    {
                        list.Add(
                            new ServiceAttribute(DeviceIdProfileAttributeId.PrimaryRecord,
                                                 new ServiceElement(ElementType.Boolean, deviceInfo.primary_record)));
                    }
                    if (deviceInfo.vendor_id_source != 0)
                    {
                        list.Add(
                            new ServiceAttribute(DeviceIdProfileAttributeId.VendorIdSource,
                                                 new ServiceElement(ElementType.UInt16, deviceInfo.vendor_id_source)));
                    }
                    // TO-DO URLs...
                    extras.AddRange(list);
                }
                else
                {
                    // On testing we see this never working!  For one device
                    // with an ImagingResponder record the size of 0x18 and
                    // not 0x8 as per definition, and the port value is wrong.
                    // And for its PhonebookAccessPse record the size is
                    // correctly 0x8, but again the port value is wrong!
                    //
                    var sppInfo = (Structs.BtSdkRmtSPPSvcExtAttrStru)Marshal.PtrToStructure(
                        attrs.ext_attributes, typeof(Structs.BtSdkRmtSPPSvcExtAttrStru));
                    Debug.Assert(sppInfo.size == Marshal.SizeOf(typeof(Structs.BtSdkRmtSPPSvcExtAttrStru)),
                                 "Different sizes!");
                    port = sppInfo.server_channel;
                }
                api.Btsdk_FreeMemory(attrs.ext_attributes);
            }//if (attrs.ext_attributes != NULL)
            // Use a different API to try and get the RFCOMM port number as
            // the previous API is quite rubbish at doing that!!
            var svcB   = new Structs.BtSdkAppExtSPPAttrStru(sc);
            var retSpp = api.Btsdk_SearchAppExtSPPService(attrs.dev_hdl, ref svcB);

            if (retSpp == BtSdkError.NO_SERVICE)   // error
            {
            }
            else if (retSpp != BtSdkError.OK)     // error
            {
                Debug.WriteLine("GetSvcRcds Btsdk_SearchAppExtSPPService ret: "
                                + BluesoleilUtils.BtSdkErrorToString(retSpp));
            }
            else     // success
            {
                if (svcB.rf_svr_chnl != 0)
                {
                    byte newPort = svcB.rf_svr_chnl;
                    if (port.HasValue)
                    {
                        Debug.Assert(port.Value == newPort, "port: " + port.Value + ", newPort: " + newPort);
                    }
                    else
                    {
                        port = newPort;
                    }
                }
                if (svcB.sdp_record_handle != 0)
                {
                    bldr.AddCustomAttribute(new ServiceAttribute(
                                                UniversalAttributeId.ServiceRecordHandle,
                                                ServiceElement.CreateNumericalServiceElement(ElementType.UInt32, svcB.sdp_record_handle)));
                }
#if DEBUG
                Debug.Assert(svcB.service_class_128 == sc, "svcSpp.service_class_128: " + svcB.service_class_128 + ", sc: " + sc);
                var snSpp = BluesoleilUtils.FromNameString(svcB.svc_name, StackConsts.BTSDK_SERVICENAME_MAXLENGTH);
                if (snSpp == null)
                {
                    Debug.Assert(name == null || name.Length == 0, "svcSpp.svc_name: null" + ", name: " + name);
                }
                else if (snSpp.Length == 1)
                {
                    // SearchAppExtSPPService doesn't handle Unicode
                    // but Btsdk_BrowseRemoteServicesEx etc does.
                    Debug.Assert(snSpp[0] == name[0], "svcSpp.svc_name: " + snSpp + ", name: " + name);
                }
                else
                {
                    Debug.Assert(snSpp == name, "svcSpp.svc_name: " + snSpp + ", bldr.ServiceName: " + name);
                }
#endif
            }
            //
            if (port.HasValue)
            {
            }
            else
            {
                bldr.ProtocolType = BluetoothProtocolDescriptorType.None;
            }
            if (extras.Count != 0)
            {
                bldr.AddCustomAttributes(extras);
            }
            //
            const ServiceAttributeId FakeDescr = (ServiceAttributeId)(-1);
            bldr.AddCustomAttribute(new ServiceAttribute(FakeDescr,
                                                         new ServiceElement(ElementType.TextString,
                                                                            "<partial BlueSoleil decode>")));
            ServiceRecord sr = bldr.ServiceRecord;
            if (port.HasValue)
            {
                Debug.Assert(bldr.ProtocolType == BluetoothProtocolDescriptorType.Rfcomm,
                             "type=" + bldr.ProtocolType);
                ServiceRecordHelper.SetRfcommChannelNumber(sr, port.Value);
            }
            else
            {
                bldr.ProtocolType = BluetoothProtocolDescriptorType.None;
            }
            return(sr);
        }
Ejemplo n.º 8
0
        static void Main(string[] args)
        {
            BluetoothListener l = new BluetoothListener(BluetoothService.CreateBluetoothUuid(0xFEE0));

            l.Start();
        }