Bug 654725 - Changes in OS X 10.7 break our Wi-Fi monitor code, causing crashes. r=josh

This commit is contained in:
Steven Michaud 2011-05-10 14:44:17 -05:00
parent 0b6096defb
commit 55f9653a14
2 changed files with 37 additions and 4 deletions

View File

@ -70,6 +70,11 @@ public:
// mac_as_int is big-endian. Write in byte chunks.
// Format is XX-XX-XX-XX-XX-XX.
const unsigned char holder[6] = {0};
if (!mac_as_int) {
mac_as_int = holder;
}
static const char *kMacFormatString = ("%02x-%02x-%02x-%02x-%02x-%02x");
sprintf(mMac, kMacFormatString,
@ -80,7 +85,7 @@ public:
};
void setSSID(const char* aSSID, unsigned long len) {
if (len < sizeof(mSsid)) {
if (aSSID && (len < sizeof(mSsid))) {
strncpy(mSsid, aSSID, len);
mSsid[len] = 0;
mSsidLen = len;

View File

@ -97,9 +97,37 @@ GetAccessPointsFromWLAN(nsCOMArray<nsWifiAccessPoint> &accessPoints)
[pool release];
return NS_ERROR_OUT_OF_MEMORY;
}
NSData* data = [anObject bssidData];
ap->setMac((unsigned char*)[data bytes]);
ap->setSignal([[anObject rssi] intValue]);
// [CWInterface bssidData] is deprecated on OS X 10.7 and up. Which is
// is a pain, so we'll use it for as long as it's available.
unsigned char macData[6] = {0};
if ([anObject respondsToSelector:@selector(bssidData)]) {
NSData* data = [anObject bssidData];
if (data) {
memcpy(macData, [data bytes], 6);
}
} else {
// [CWInterface bssid] returns a string formatted "00:00:00:00:00:00".
NSString* macString = [anObject bssid];
if (macString && ([macString length] == 17)) {
for (NSUInteger i = 0; i < 6; ++i) {
NSString* part = [macString substringWithRange:NSMakeRange(i * 3, 2)];
macData[i] = (unsigned char) [part integerValue];
}
}
}
// [CWInterface rssiValue] is available on OS X 10.7 and up (and
// [CWInterface rssi] is deprecated).
int signal = 0;
if ([anObject respondsToSelector:@selector(rssiValue)]) {
signal = (int) ((NSInteger) [anObject rssiValue]);
} else {
signal = [[anObject rssi] intValue];
}
ap->setMac(macData);
ap->setSignal(signal);
ap->setSSID([[anObject ssid] UTF8String], 32);
accessPoints.AppendObject(ap);