/*
|
* Copyright (c) 2010-2020 Belledonne Communications SARL.
|
*
|
* This file is part of linphone-iphone
|
*
|
* This program is free software: you can redistribute it and/or modify
|
* it under the terms of the GNU General Public License as published by
|
* the Free Software Foundation, either version 3 of the License, or
|
* (at your option) any later version.
|
*
|
* This program is distributed in the hope that it will be useful,
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* GNU General Public License for more details.
|
*
|
* You should have received a copy of the GNU General Public License
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
*/
|
|
#import <Foundation/Foundation.h>
|
|
#import "LinphoneManager.h"
|
#import "XMLRPCHelper.h"
|
#import "Utils.h"
|
#import "PhoneMainView.h"
|
|
/* This subclass allows use to store the block to execute on success */
|
@interface XMLRPCRequestObject : NSObject
|
@property(copy, nonatomic) void (^XMLRPCHelperBlockSuccess)(NSString *something);
|
@property(copy, nonatomic) void (^XMLRPCHelperBlockError)(NSString *something);
|
@property LinphoneXmlRpcRequest *xmlRpcRequest;
|
@end
|
|
@implementation XMLRPCRequestObject
|
@end
|
|
@implementation XMLRPCHelper
|
|
#pragma mark - API
|
|
// typedef void (^XMLRPCHelperBlock)(NSString *something);
|
|
// XMLRPCHelperBlock successBlock = nil;
|
// XMLRPCHelperBlock errorBlock = nil;
|
|
NSMutableArray *personsArray;
|
|
/*****************************************************************************************/
|
+ (void)initArray {
|
personsArray = [[NSMutableArray alloc] init];
|
}
|
|
+ (void)sendXMLRPCRequest:(NSString *)method {
|
[self sendXMLRPCRequestWithParams:method withParams:nil onSuccess:nil onError:nil];
|
}
|
|
+ (void)sendXMLRPCRequestWithParams:(NSString *)method withParams:(NSArray *)params {
|
[self sendXMLRPCRequestWithParams:method withParams:params onSuccess:nil onError:nil];
|
}
|
|
+ (void)sendXMLRPCRequestWithParams:(NSString *)method
|
withParams:(NSArray *)params
|
onSuccess:(void (^)(NSString *))successBk {
|
[self sendXMLRPCRequestWithParams:method withParams:params onSuccess:successBk onError:nil];
|
}
|
|
// change block by callback and implement callback with different behavior if success (: call InAppManager) or error (:
|
// manage error here)
|
+ (void)sendXMLRPCRequestWithParams:(NSString *)method
|
withParams:(NSArray *)params
|
onSuccess:(void (^)(NSString *))successBk
|
onError:(void (^)(NSString *req))errorBk {
|
LOGI(@"XMLRPC %@ - %@", method, params);
|
XMLRPCRequestObject *requestObject = [XMLRPCRequestObject alloc];
|
const char *URL =
|
[LinphoneManager.instance lpConfigStringForKey:@"receipt_validation_url" inSection:@"in_app_purchase"]
|
.UTF8String;
|
|
requestObject.XMLRPCHelperBlockSuccess = successBk;
|
requestObject.XMLRPCHelperBlockError = errorBk;
|
|
// Create LinphoneXMLRPCRequest
|
LinphoneXmlRpcSession *requestSession = linphone_xml_rpc_session_new(LC, URL);
|
// LinphoneXmlRpcRequest *request = linphone_xml_rpc_request_new(method.UTF8String, LinphoneXmlRpcArgString);
|
requestObject.xmlRpcRequest = linphone_xml_rpc_request_new(LinphoneXmlRpcArgString, method.UTF8String);
|
|
[personsArray addObject:requestObject];
|
// Set argument to this LinphoneXMLRPCRequest
|
for (NSString *item in params) {
|
NSLog(@"Linphone XMLRPC Request with argument: %@", item);
|
linphone_xml_rpc_request_add_string_arg(requestObject.xmlRpcRequest, item.UTF8String);
|
}
|
|
// Ref and send the LinphoneXMLRPCRequest
|
requestSession = linphone_xml_rpc_session_ref(requestSession);
|
linphone_xml_rpc_session_send_request(requestSession, requestObject.xmlRpcRequest);
|
|
// Set the callbacks to this LinphoneXMLRPCRequest
|
LinphoneXmlRpcRequestCbs *cbs = linphone_xml_rpc_request_get_callbacks(requestObject.xmlRpcRequest);
|
|
// Register XMLRPCHelper in user data to get it back on Callback rised
|
XMLRPCHelper *xMLRPCHelper = [[XMLRPCHelper alloc] init];
|
linphone_xml_rpc_request_set_user_data(requestObject.xmlRpcRequest, ((void *)CFBridgingRetain(xMLRPCHelper)));
|
|
// Set the response Callback
|
linphone_xml_rpc_request_cbs_set_response(cbs, linphone_xmlrpc_call_back_received);
|
}
|
|
static void linphone_xmlrpc_call_back_received(LinphoneXmlRpcRequest *request) {
|
[(__bridge XMLRPCHelper *)linphone_xml_rpc_request_get_user_data(request) dealWithXmlRpcResponse:request];
|
}
|
|
- (void)dealWithXmlRpcResponse:(LinphoneXmlRpcRequest *)request {
|
XMLRPCRequestObject *xmlrpcObject;
|
NSInteger index = 0;
|
for (int i = 0; i < [personsArray count]; i++) {
|
xmlrpcObject = [personsArray objectAtIndex:i];
|
if (xmlrpcObject.xmlRpcRequest == request)
|
break;
|
index++;
|
}
|
|
NSString *responseString =
|
[NSString stringWithFormat:@"%s", (linphone_xml_rpc_request_get_string_response(request))];
|
LOGI(@"XMLRPC query: %@", responseString);
|
if (linphone_xml_rpc_request_get_status(request) == LinphoneXmlRpcStatusOk) {
|
// Call success block
|
xmlrpcObject.XMLRPCHelperBlockSuccess(responseString);
|
} else if (linphone_xml_rpc_request_get_status(request) == LinphoneXmlRpcStatusFailed) {
|
if (xmlrpcObject.XMLRPCHelperBlockError != nil) {
|
LOGI(@"XMLRPC query ErrorBlock rised");
|
xmlrpcObject.XMLRPCHelperBlockError(responseString);
|
}
|
// Display Error alert
|
[self displayErrorPopup:@"LinphoneXMLRPC Request Failed"];
|
}
|
linphone_xml_rpc_request_unref(request);
|
[personsArray removeObjectAtIndex:index];
|
}
|
|
#pragma mark - Error alerts
|
|
- (void)displayErrorPopup:(NSString *)error {
|
UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Server request error", nil)
|
message:error
|
preferredStyle:UIAlertControllerStyleAlert];
|
|
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
|
style:UIAlertActionStyleDefault
|
handler:^(UIAlertAction * action) {}];
|
|
[errView addAction:defaultAction];
|
[PhoneMainView.instance presentViewController:errView animated:YES completion:nil];
|
}
|
|
@end
|
|
/*****************************************************************************************/
|