webrtc/examples/objc/AppRTCMobile/common/ARDUtilities.m
Anders Carlsson 7bca8ca4e2 Obj-C SDK Cleanup
This CL separates the files under sdk/objc into logical directories, replacing
the previous file layout under Framework/.

A long term goal is to have some system set up to generate the files under
sdk/objc/api (the PeerConnection API wrappers) from the C++ code. In the shorter
term the goal is to abstract out shared concepts from these classes in order to
make them as uniform as possible.

The separation into base/, components/, and helpers/ are to differentiate between
the base layer's common protocols, various utilities and the actual platform
specific components.

The old directory layout that resembled a framework's internal layout is not
necessary, since it is generated by the framework target when building it.

Bug: webrtc:9627
Change-Id: Ib084fd83f050ae980649ca99e841f4fb0580bd8f
Reviewed-on: https://webrtc-review.googlesource.com/94142
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Reviewed-by: Henrik Andreassson <henrika@webrtc.org>
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24493}
2018-08-30 10:42:41 +00:00

126 lines
4.2 KiB
Objective-C

/*
* Copyright 2014 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#import "ARDUtilities.h"
#import <mach/mach.h>
#import <WebRTC/RTCLogging.h>
@implementation NSDictionary (ARDUtilites)
+ (NSDictionary *)dictionaryWithJSONString:(NSString *)jsonString {
NSParameterAssert(jsonString.length > 0);
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary *dict =
[NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (error) {
RTCLogError(@"Error parsing JSON: %@", error.localizedDescription);
}
return dict;
}
+ (NSDictionary *)dictionaryWithJSONData:(NSData *)jsonData {
NSError *error = nil;
NSDictionary *dict =
[NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
if (error) {
RTCLogError(@"Error parsing JSON: %@", error.localizedDescription);
}
return dict;
}
@end
@implementation NSURLConnection (ARDUtilities)
+ (void)sendAsyncRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLResponse *response,
NSData *data,
NSError *error))completionHandler {
// Kick off an async request which will call back on main thread.
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (completionHandler) {
completionHandler(response, data, error);
}
}] resume];
}
// Posts data to the specified URL.
+ (void)sendAsyncPostToURL:(NSURL *)url
withData:(NSData *)data
completionHandler:(void (^)(BOOL succeeded,
NSData *data))completionHandler {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.HTTPBody = data;
[[self class] sendAsyncRequest:request
completionHandler:^(NSURLResponse *response,
NSData *data,
NSError *error) {
if (error) {
RTCLogError(@"Error posting data: %@", error.localizedDescription);
if (completionHandler) {
completionHandler(NO, data);
}
return;
}
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if (httpResponse.statusCode != 200) {
NSString *serverResponse = data.length > 0 ?
[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] :
nil;
RTCLogError(@"Received bad response: %@", serverResponse);
if (completionHandler) {
completionHandler(NO, data);
}
return;
}
if (completionHandler) {
completionHandler(YES, data);
}
}];
}
@end
NSInteger ARDGetCpuUsagePercentage() {
// Create an array of thread ports for the current task.
const task_t task = mach_task_self();
thread_act_array_t thread_array;
mach_msg_type_number_t thread_count;
if (task_threads(task, &thread_array, &thread_count) != KERN_SUCCESS) {
return -1;
}
// Sum cpu usage from all threads.
float cpu_usage_percentage = 0;
thread_basic_info_data_t thread_info_data = {};
mach_msg_type_number_t thread_info_count;
for (size_t i = 0; i < thread_count; ++i) {
thread_info_count = THREAD_BASIC_INFO_COUNT;
kern_return_t ret = thread_info(thread_array[i],
THREAD_BASIC_INFO,
(thread_info_t)&thread_info_data,
&thread_info_count);
if (ret == KERN_SUCCESS) {
cpu_usage_percentage +=
100.f * (float)thread_info_data.cpu_usage / TH_USAGE_SCALE;
}
}
// Dealloc the created array.
vm_deallocate(task, (vm_address_t)thread_array,
sizeof(thread_act_t) * thread_count);
return lroundf(cpu_usage_percentage);
}