422
* Online Accounts API backend binding
425
function createOnlineAccountsApi(backendDelegate) {
426
var PLUGIN_URI = 'Ubuntu.OnlineAccounts';
429
function Account(account, objectid) {
432
id = backendDelegate.storeQmlObject(transfer,
433
PLUGIN_URI, VERSION, 'Account');
436
this._object = account;
438
Account.prototype = {
439
_validate: function() {
441
throw new TypeError("Invalid object null");
444
destroy: function() {
447
this._object.destroy();
448
backendDelegate.deleteId(this._id);
452
serialize: function() {
455
type: 'object-proxy',
456
apiid: 'OnlineAccounts',
457
objecttype: 'Account',
460
// serialize immutable values
462
enabled: self._object.enabled,
463
provider: self._object.provider,
464
displayName: self._object.displayName,
465
accountId: self._object.accountId,
473
enabled: function(callback) {
475
callback(this._object.enabled);
479
provider: function(callback) {
481
callback(this._object.provider);
485
displayName: function(callback) {
487
callback(this._object.displayName);
491
accountId: function(callback) {
493
callback(this._object.accountId);
498
updateDisplayName: function(displayName) {
500
this._object.updateDisplayName(displayName);
503
updateEnabled: function(enabled) {
505
this._object.updateEnabled(enabled);
508
remove: function(enabled) {
510
this._object.remove();
514
function AccountService(service, objectid) {
517
var result = backendDelegate.createQmlObject(
518
PLUGIN_URI, VERSION, 'AccountService');
520
service = result.object;
523
id = backendDelegate.storeQmlObject(service,
524
PLUGIN_URI, VERSION, 'AccountService');
527
this._object = service;
529
AccountService.prototype = {
530
_validate: function() {
532
throw new TypeError("Invalid object null");
535
destroy: function() {
538
this._object.destroy();
539
backendDelegate.deleteId(this._id);
543
serialize: function() {
546
type: 'object-proxy',
547
apiid: 'OnlineAccounts',
548
objecttype: 'AccountService',
551
// serialize immutable values
554
accountId: self._object.accountId,
555
enabled: self._object.enabled,
556
serviceEnabled: self._object.serviceEnabled,
557
displayName: self._object.displayName,
558
provider: self.internal.getProvider(self),
559
service: self.internal.getService(self),
566
autoSync: function(callback) {
568
callback(this._object.autoSync);
570
setAutoSync: function(autoSync, callback) {
572
this._object.autoSync = autoSync;
578
accountId: function(callback) {
580
callback(this._object.accountId);
584
enabled: function(callback) {
586
callback(this._object.enabled);
590
serviceEnabled: function(callback) {
592
callback(this._object.serviceEnabled);
596
displayName: function(callback) {
598
callback(this._object.displayName);
602
provider: function(callback) {
604
callback(this.internal.getProvider(this));
608
service: function(callback) {
610
callback(this.internal.getService(this));
613
objectHandle: function(callback) {
615
callback(this._object.objectHandle);
617
setObjectHandle: function(objectHandle) {
619
this._object.objectHandle = objectHandle;
623
authenticate: function(callback) {
627
var onAuthenticationError;
630
onAuthenticated = function(reply) {
631
callback({error: null,
635
self._object.onAuthenticated.disconnect(onAuthenticated);
636
self._object.onAuthenticationError.disconnect(onAuthenticationError);
638
onAuthenticationError = function(error){
639
callback({error: error.message,
640
authenticated: false,
644
self._object.onAuthenticated.disconnect(onAuthenticated);
645
self._object.onAuthenticationError.disconnect(onAuthenticationError);
648
this._object.onAuthenticated.connect(onAuthenticated);
649
this._object.onAuthenticationError.connect(onAuthenticationError);
651
this._object.authenticate(null);
657
getService: function(self) {
659
id: self._object.service.id,
660
displayName: self._object.service.displayName,
661
iconName: self._object.service.iconName,
664
getProvider: function(self) {
666
id: self._object.provider.id,
667
displayName: self._object.provider.displayName,
668
iconName: self._object.provider.iconName,
676
var result = backendDelegate.createQmlObject(
677
PLUGIN_URI, VERSION, 'Manager');
678
this._id = result.id;
679
this._object = result.object;
681
Manager.prototype = {
682
_validate: function() {
684
throw new TypeError("Invalid object null");
687
destroy: function() {
690
this._object.destroy();
691
backendDelegate.deleteId(this._id);
695
serialize: function() {
697
type: 'object-proxy',
698
apiid: 'OnlineAccounts',
699
objecttype: 'Manager',
705
createAccount: function(providerName, callback) {
707
var account = new Account(this._object.createAccount(providerName));
708
callback(account.serialize());
710
loadAccount: function(id, callback) {
712
var account = new Account(this._object.loadAccount(id));
713
callback(account.serialize());
717
loadAccount: function(self, id) {
718
return new Account(self._object.loadAccount(id));
724
function ProviderModel() {
725
var result = backendDelegate.createQmlObject(
726
PLUGIN_URI, VERSION, 'ProviderModel');
727
this._id = result.id;
728
this._object = result.object;
730
this._modelAdaptor = backendDelegate.createModelAdaptorFor(this._object);
731
this._roles = this._modelAdaptor.roles();
733
ProviderModel.prototype = {
734
_validate: function() {
736
throw new TypeError("Invalid object null");
739
destroy: function() {
742
this._object.destroy();
743
this._modelAdaptor.destroy();
744
backendDelegate.deleteId(this._id);
748
serialize: function() {
751
type: 'object-proxy',
752
apiid: 'OnlineAccounts',
753
objecttype: 'ProviderModel',
760
applicationId: function(callback) {
762
callback(this._object.applicationId);
764
setApplicationId: function(applicationId, callback) {
766
this._object.applicationId = applicationId;
771
// QAbtractListModel prototype
772
count: function(callback) {
774
if (this._modelAdaptor) {
777
callback(this._modelAdaptor.rowCount());
780
at: function(idx, callback) {
782
if (idx >= this.proxy.count || ! this._modelAdaptor) {
788
for (var role in this._roles) {
789
result[role] = this._modelAdaptor.itemAt(idx, role);
795
function AccountServiceModel(filterParams) {
796
var result = backendDelegate.createQmlObject(
797
PLUGIN_URI, VERSION, 'AccountServiceModel', filterParams);
798
this._id = result.id;
799
this._object = result.object;
801
this._modelAdaptor = backendDelegate.createModelAdaptorFor(this._object);
802
this._roles = this._modelAdaptor.roles();
804
// quickly filter out roles that are "tricky"
805
if (this._roles.indexOf('accountServiceHandle') !== -1) {
806
this._roles.splice(this._roles.indexOf('accountServiceHandle'), 1);
808
if (this._roles.indexOf('accountHandle') !== -1) {
809
this._roles.splice(this._roles.indexOf('accountHandle'), 1);
812
AccountServiceModel.prototype = {
813
_validate: function() {
815
throw new TypeError("Invalid object null");
818
destroy: function() {
821
this._object.destroy();
822
this._modelAdaptor.destroy();
823
backendDelegate.deleteId(this._id);
827
count: function(callback) {
829
callback(this._object.count);
832
service: function(callback) {
834
callback(this._object.service);
836
setService: function(service, callback) {
838
this._object.service = service;
843
provider: function(callback) {
845
callback(this._object.provider);
847
setProvider: function(provider, callback) {
849
this._object.provider = provider;
854
serviceType: function(callback) {
856
callback(this._object.serviceType);
858
setServiceType: function(serviceType, callback) {
860
this._object.serviceType = serviceType;
865
includeDisabled: function(callback) {
867
callback(this._object.includeDisabled);
869
setIncludeDisabled: function(includeDisabled, callback) {
871
this._object.includeDisabled = includeDisabled;
876
accountId: function(callback) {
878
callback(this._object.accountId);
880
setAccountId: function(accountId, callback) {
882
this._object.accountId = accountId;
887
// QAbtractListModel prototype
888
count: function(callback) {
889
if (this._modelAdaptor) {
892
callback(this._modelAdaptor.rowCount());
895
at: function(idx, callback) {
896
var count = this._modelAdaptor.rowCount();
897
if (idx >= count || ! this._modelAdaptor) {
902
for (var role in this._roles) {
903
result[role] = this._modelAdaptor.itemAt(idx, role);
908
// Internal bits, not part of the API (especially no async)
912
// special case for an object wrapper
913
accountServiceAtIndex: function(self, idx) {
916
var accountServiceHandle = self._modelAdaptor.itemAt(idx, "accountServiceHandle");
918
if (accountServiceHandle != null) {
919
var accountService = new AccountService();
920
accountService.setObjectHandle(accountServiceHandle);
921
return accountService;
927
itemAt: function(self, idx, role) {
929
return self._modelAdaptor.itemAt(idx, role);
932
count: function(self) {
933
return self._modelAdaptor ?
934
self._modelAdaptor.rowCount()
938
includeDisabled: function(self) {
939
return self._object.includeDisabled;
944
function _constructorFromName(className) {
945
var constructorPerName = {
946
"AccountServiceModel": AccountServiceModel,
948
"ProviderModel": ProviderModel,
950
"AccountService": AccountService
952
return className in constructorPerName
953
? constructorPerName[className]
958
createAccountServiceModel: function(callback) {
959
var service = new AccountServiceModel();
960
callback(service.serialize());
962
createManager: function(callback) {
963
var manager = new Manager();
964
callback(manager.serialize());
966
createProviderModel: function(callback) {
967
var provider = new ProviderModel();
968
callback(provider.serialize());
972
getAccountsInfoFor: function(service, provider, callback) {
973
var serviceModel = new AccountServiceModel({'service': service, 'provider': provider});
975
var count = serviceModel.internal.count(serviceModel);
976
var accountsInfo = []
977
for (var i = 0; i < count; ++i) {
978
var displayName = serviceModel.internal.itemAt(serviceModel, i, "displayName");
979
var accountId = serviceModel.internal.itemAt(serviceModel, i, "accountId");
980
var providerName = serviceModel.internal.itemAt(serviceModel, i, "providerName");
981
var serviceName = serviceModel.internal.itemAt(serviceModel, i, "serviceName");
982
var enabled = serviceModel.internal.itemAt(serviceModel, i, "enabled");
984
accountsInfo.push({displayName: displayName
985
, accountId: accountId
986
, providerName: providerName
987
, serviceName: serviceName
991
serviceModel.destroy();
993
callback(accountsInfo);
996
getAccounts: function(filters, callback) {
997
var serviceModel = new AccountServiceModel(filters);
998
var count = serviceModel.internal.count(serviceModel);
1000
for (var i = 0; i < count; ++i) {
1001
var service = serviceModel.internal.accountServiceAtIndex(serviceModel, i);
1003
var s = service.serialize();
1004
console.debug(JSON.stringify(s.content))
1011
getAccountById: function(accountId, callback) {
1012
var manager = new Manager();
1013
var account = manager.internal.loadAccount(manager, accountId);
1015
callback(account.serialize());
1018
getAccessTokenFor: function(serviceName, providerName, accountId, callback) {
1019
var serviceModel = new AccountServiceModel();
1022
serviceModel.setService(serviceName);
1024
serviceModel.setProvider(providerName);
1026
serviceModel.setAccountId(accountId);
1028
var count = serviceModel.internal.count(serviceModel);
1032
console.debug("More than one account with id: " + accountId);
1034
var onAuthenticated = function(results) {
1035
serviceModel.destroy();
1038
serviceModel.internal
1039
.accountServiceAtIndex(serviceModel, accountIdx)
1040
.authenticate(onAuthenticated);
1043
serviceModel.destroy();
1044
callback({error: "No account found"});
1050
dispatchToObject: function(infos) {
1051
var args = infos.args;
1052
var callback = infos.callback;
1053
var method_name = infos.method_name;
1054
var objectid = infos.objectid;
1055
var class_name = infos.class_name;
1058
args.push(callback);
1060
var o = backendDelegate.objectFromId(objectid);
1062
console.debug('Cannot dispatch to unknown object: ' + objectid);
1066
var Constructor = _constructorFromName(class_name);
1068
var instance = new Constructor(o, objectid);
1070
instance[method_name].apply(instance, args);
1078
* Alarm API backend binding
1081
function createAlarmApi(backendDelegate) {
1082
var PLUGIN_URI = 'Ubuntu.Components';
1085
function _nameToAlarmType(name) {
1086
var alarmTypePerName = {
1087
"OneTime": ComponentsBridge.Alarm.OneTime,
1088
"Repeating": ComponentsBridge.Alarm.Repeating,
1090
return name in alarmTypePerName ?
1091
alarmTypePerName[name]
1092
: ComponentsBridge.Alarm.OneTime;
1094
function _alarmTypeToName(type) {
1095
if (type === ComponentsBridge.Alarm.OneTime)
1097
else if (type === ComponentsBridge.Alarm.Repeating)
1102
function Alarm(alarm, objectid) {
1105
var result = backendDelegate.createQmlObject(
1106
PLUGIN_URI, VERSION, 'Alarm');
1108
alarm = result.object;
1111
id = backendDelegate.storeQmlObject(alarm,
1112
PLUGIN_URI, VERSION, 'Account');
1116
this._object = alarm;
1119
_validate: function() {
1121
throw new TypeError("Invalid object null");
1124
destroy: function() {
1127
this._object.destroy();
1128
backendDelegate.deleteId(this._id);
1132
serialize: function() {
1134
type: 'object-proxy',
1136
objecttype: 'Alarm',
1142
cancel: function() {
1144
this._object.cancel();
1148
this._object.reset();
1152
this._object.save();
1157
error: function(callback) {
1159
callback(this._object.error);
1162
date: function(callback) {
1164
callback(this._object.date.getTime());
1166
setDate: function(date, callback) {
1168
var _date = new Date();
1169
_date.setTime(parseInt(date));
1170
this._object.date = _date;
1171
if (callback && typeof(callback) === 'function')
1175
daysOfWeek: function(callback) {
1177
callback(this._object.daysOfWeek);
1179
setDaysOfWeek: function(daysOfWeek, callback) {
1181
this._object.daysOfWeek = daysOfWeek;
1182
if (callback && typeof(callback) === 'function')
1186
enabled: function(callback) {
1188
callback(this._object.enabled);
1190
setEnabled: function(enabled, callback) {
1192
this._object.enabled = enabled;
1193
if (callback && typeof(callback) === 'function')
1197
message: function(callback) {
1199
callback(this._object.message);
1201
setMessage: function(message, callback) {
1203
this._object.message = message;
1204
if (callback && typeof(callback) === 'function')
1208
sound: function(callback) {
1210
callback(this._object.sound);
1212
setSound: function(sound, callback) {
1214
this._object.sound = sound;
1215
if (callback && typeof(callback) === 'function')
1219
status: function(callback) {
1221
callback(this._object.status.toString());
1224
type: function(callback) {
1226
callback(_alarmTypeToName(this._object.type));
1228
setType: function(type, callback) {
1230
this._object.type = _nameToAlarmType(type);
1231
if (callback && typeof(callback) === 'function')
1238
error: function(self) {
1239
return self._object.error;
1244
function _constructorFromName(className) {
1245
var constructorPerName = {
1248
return className in constructorPerName
1249
? constructorPerName[className]
1254
createAlarm: function(callback) {
1255
console.log('createAlarm')
1256
var alarm = new Alarm();
1257
callback(alarm.serialize());
1260
createAndSaveAlarmFor: function(date, type, daysOfWeek, message, callback) {
1261
var alarm = new Alarm();
1263
alarm.setDate(date);
1264
alarm.setMessage(message);
1265
alarm.setType(_nameToAlarmType(type));
1266
alarm.setDaysOfWeek(daysOfWeek);
1269
if (callback && typeof(callback) === 'function')
1270
callback(alarm.internal.error(alarm));
1278
dispatchToObject: function(infos) {
1279
var args = infos.args;
1280
var callback = infos.callback;
1281
var method_name = infos.method_name;
1282
var objectid = infos.objectid;
1283
var class_name = infos.class_name;
1286
args.push(callback);
1288
var o = backendDelegate.objectFromId(objectid);
1290
console.debug('Cannot dispatch to unknown object: ' + objectid);
1294
var Constructor = _constructorFromName(class_name);
1296
var instance = new Constructor(o, objectid);
1298
instance[method_name].apply(instance, args);
1306
* ContentHub API backend binding
1310
function createContentHubApi(backendDelegate) {
1311
var PLUGIN_URI = 'Ubuntu.Content';
1314
var _contenthub = ContentHubBridge.ContentHub;
1316
// TODO find a better way
1317
function _nameToContentType(name) {
1318
var contentTypePerName = {
1319
"All": ContentHubBridge.ContentType.All,
1320
"Unknown": ContentHubBridge.ContentType.Unknown,
1321
"Pictures": ContentHubBridge.ContentType.Pictures,
1322
"Documents": ContentHubBridge.ContentType.Documents,
1323
"Music": ContentHubBridge.ContentType.Music,
1324
"Contacts": ContentHubBridge.ContentType.Contacts,
1326
return name in contentTypePerName ?
1327
contentTypePerName[name]
1328
: ContentHubBridge.ContentType.Unknown;
1330
function _contentTypeToName(state) {
1331
if (state === ContentHubBridge.ContentType.All)
1333
else if (state === ContentHubBridge.ContentType.Unknown)
1335
else if (state === ContentHubBridge.ContentType.Pictures)
1337
else if (state === ContentHubBridge.ContentType.Documents)
1339
else if (state === ContentHubBridge.ContentType.Music)
1341
else if (state === ContentHubBridge.ContentType.Contacts)
1346
function _nameToContentTransferSelection(name) {
1347
var contentTypePerName = {
1348
"Single": ContentHubBridge.ContentTransfer.Single,
1349
"Multiple": ContentHubBridge.ContentTransfer.Multiple,
1351
return name in contentTypePerName ?
1352
contentTypePerName[name]
1353
: ContentHubBridge.ContentTransfer.Single;
1355
function _contentTransferSelectionToName(state) {
1356
if (state === ContentHubBridge.ContentTransfer.Single)
1358
else if (state === ContentHubBridge.ContentTransfer.Multiple)
1363
function _nameToContentHandler(name) {
1364
var contentHandlerPerName = {
1365
"Source": ContentHubBridge.ContentHandler.Source,
1366
"Destination": ContentHubBridge.ContentHandler.Destination,
1367
"Share": ContentHubBridge.ContentHandler.Share,
1369
return name in contentHandlerPerName ?
1370
contentHandlerPerName[name]
1371
: ContentHubBridge.ContentHandler.Source;
1373
function _contentHandlerToName(state) {
1374
if (state === ContentHubBridge.ContentHandler.Source)
1376
else if (state === ContentHubBridge.ContentHandler.Destination)
1377
return "Destination";
1378
else if (state === ContentHubBridge.ContentHandler.Share)
1383
function _nameToContentTransferDirection(name) {
1384
var contentTypePerName = {
1385
"Import": ContentHubBridge.ContentTransfer.Import,
1386
"Export": ContentHubBridge.ContentTransfer.Export,
1387
"Share": ContentHubBridge.ContentTransfer.Share,
1389
return name in contentTypePerName ?
1390
contentTypePerName[name]
1391
: ContentHubBridge.ContentTransfer.Import;
1393
function _contentTransferDirectionToName(state) {
1394
if (state === ContentHubBridge.ContentTransfer.Import)
1396
else if (state === ContentHubBridge.ContentTransfer.Export)
1398
else if (state === ContentHubBridge.ContentTransfer.Share)
1403
function _nameToContentScope(name) {
1404
var contentScopePerName = {
1405
"System": ContentHubBridge.ContentScope.System,
1406
"User": ContentHubBridge.ContentScope.User,
1407
"App": ContentHubBridge.ContentScope.App,
1409
return name in contentScopePerName ?
1410
contentScopePerName[name]
1411
: ContentHubBridge.ContentScope.App;
1413
function _contentScopeToName(state) {
1414
if (state === ContentHubBridge.ContentScope.System)
1416
else if (state === ContentHubBridge.ContentScope.User)
1418
else if (state === ContentHubBridge.ContentScope.App)
1423
function _nameToContentTransferState(name) {
1424
var contentTransferStatePerName = {
1425
"Created": ContentHubBridge.ContentTransfer.Created,
1426
"Initiated": ContentHubBridge.ContentTransfer.Initiated,
1427
"InProgress": ContentHubBridge.ContentTransfer.InProgress,
1428
"Charged": ContentHubBridge.ContentTransfer.Charged,
1429
"Collected": ContentHubBridge.ContentTransfer.Collected,
1430
"Aborted": ContentHubBridge.ContentTransfer.Aborted,
1431
"Finalized": ContentHubBridge.ContentTransfer.Finalized,
1433
return name in contentTransferStatePerName ?
1434
contentTransferStatePerName[name]
1435
: ContentHubBridge.ContentTransfer.Created;
1437
function _contentTransferStateToName(state) {
1438
if (state === ContentHubBridge.ContentTransfer.Created)
1440
else if (state === ContentHubBridge.ContentTransfer.Initiated)
1442
else if (state === ContentHubBridge.ContentTransfer.InProgress)
1443
return "InProgress";
1444
else if (state === ContentHubBridge.ContentTransfer.Charged)
1446
else if (state === ContentHubBridge.ContentTransfer.Collected)
1448
else if (state === ContentHubBridge.ContentTransfer.Aborted)
1450
else if (state === ContentHubBridge.ContentTransfer.Finalized)
1452
return "<Unknown State>";
1455
function ContentTransfer(transfer, objectid) {
1458
var result = backendDelegate.createQmlObject(
1459
PLUGIN_URI, VERSION, 'ContentTransfer');
1461
transfer = result.object;
1464
id = backendDelegate.storeQmlObject(transfer,
1465
PLUGIN_URI, VERSION, 'ContentTransfer');
1468
this._object = transfer;
1469
this._callback = null;
1471
ContentTransfer.prototype = {
1472
_validate: function() {
1474
throw new TypeError("Invalid object null");
1477
destroy: function() {
1480
this._object.destroy();
1481
backendDelegate.deleteId(this._id);
1485
serialize: function() {
1488
type: 'object-proxy',
1489
apiid: 'ContentHub',
1490
objecttype: 'ContentTransfer',
1493
// serialize immutable values
1496
store: self._object.store,
1497
state: self._object.state,
1498
selectionType: self._object.selectionType,
1499
direction: self._object.direction,
1506
store: function(callback) {
1508
callback(this._object.store);
1510
setStore: function(storeProxy, callback) {
1513
if (backendDelegate.isObjectProxyInfo(storeProxy)) {
1514
var store = backendDelegate.objectFromId(storeProxy.objectid);
1516
this._object.setStore(store);
1519
console.debug('setStore: invalid store object proxy');
1525
state: function(callback) {
1527
callback(_contentTransferStateToName(this._object.state));
1529
setState: function(state, callback) {
1531
this._object.state = _nameToContentTransferState(state);
1532
if (callback && typeof(callback) === 'function')
1535
onStateChanged: function(callback) {
1536
if (!callback || typeof(callback) !== 'function')
1540
this._object.onStateChanged.connect(function() {
1541
callback(_contentTransferStateToName(self._object.state));
1545
selectionType: function(callback) {
1547
callback(_contentTransferSelectionToName(this._object.selectionType));
1549
setSelectionType: function(selectionType, callback) {
1551
this._object.selectionType = _nameToContentTransferSelection(selectionType);
1552
if (callback && typeof(callback) === 'function')
1556
direction: function(callback) {
1558
callback(_contentTransferDirectionToName(this._object.direction));
1560
setDirection: function(direction, callback) {
1562
this._object.direction = _nameToContentTransferDirection(direction);
1563
if (callback && typeof(callback) === 'function')
1567
items: function(callback) {
1570
// return in serialized form
1571
callback(this.internal.serializeItems(this._object));
1573
setItems: function(items, callback) {
1575
var contentItems = [];
1576
for (var i = 0; i < items.length; ++i) {
1577
var item = backendDelegate.createQmlObject(
1578
PLUGIN_URI, VERSION, 'ContentItem');
1579
if ( ! item.object) {
1580
console.debug('Could not create ContentItem object');
1584
item.object.name = items[i].name;
1585
item.object.url = items[i].url;
1587
contentItems.push(item.object);
1590
this._object.items = contentItems;
1592
if (callback && typeof(callback) === 'function')
1597
start: function(callback) {
1601
this._callback = function () {
1602
callback(_contentTransferStateToName(self._object.state));
1604
this._object.stateChanged.connect(this._callback);
1606
this._object.start();
1608
finalize: function() {
1611
this._object.stateChanged.disconnect(this._callback);
1612
this._callback = null;
1613
this._object.finalize();
1619
serializeItems: function(self) {
1621
for (var i = 0; i < self.items.length; ++i) {
1622
items.push({name: self.items[i].name.toString(),
1623
url: self.items[i].url.toString()});
1630
function ContentStore(store, objectid) {
1633
var result = backendDelegate.createQmlObject(
1634
PLUGIN_URI, VERSION, 'ContentStore');
1636
store = result.object;
1639
id = backendDelegate.storeQmlObject(store,
1640
PLUGIN_URI, VERSION, 'ContentStore');
1643
this._object = store;
1645
ContentStore.prototype = {
1646
_validate: function() {
1648
throw new TypeError("Invalid object null");
1651
destroy: function() {
1654
this._object.destroy();
1655
backendDelegate.deleteId(this._id);
1659
serialize: function() {
1662
type: 'object-proxy',
1663
apiid: 'ContentHub',
1664
objecttype: 'ContentStore',
1667
// serialize immutable values
1670
uri: self._object.uri,
1671
scope: _contentScopeToName(self._object.scope),
1678
scope: function(callback) {
1680
callback(_contentScopeToName(this._object.scope));
1682
setScope: function(scope, callback) {
1684
this._object.scope = _nameToContentScope(scope);
1685
if (callback && typeof(callback) === 'function')
1690
uri: function(callback) {
1692
callback(this._object.uri);
1696
function ContentPeer(peer, objectid) {
1699
var result = backendDelegate.createQmlObject(
1700
PLUGIN_URI, VERSION, 'ContentPeer');
1702
peer = result.object;
1705
id = backendDelegate.storeQmlObject(peer,
1706
PLUGIN_URI, VERSION, 'ContentPeer');
1709
this._object = peer;
1711
ContentPeer.prototype = {
1712
_validate: function() {
1714
throw new TypeError("Invalid object null");
1717
destroy: function() {
1720
this._object.destroy();
1721
backendDelegate.deleteId(this._id);
1725
serialize: function() {
1728
type: 'object-proxy',
1729
apiid: 'ContentHub',
1730
objecttype: 'ContentPeer',
1733
// serialize immutable values
1736
appId: self._object.appId,
1737
name: self._object.name,
1738
handler: self._object.handler,
1739
contentType: self._object.contentType,
1740
selectionType: self._object.selectionType,
1741
isDefaultPeer: self._object.isDefaultPeer,
1748
appId: function(callback) {
1750
callback(this._object.appId);
1752
setAppId: function(appId, callback) {
1754
this._object.appId = appId;
1755
if (callback && typeof(callback) === 'function')
1759
handler: function(callback) {
1761
callback(_contentHandlerToName(this._object.handler));
1763
setHandler: function(handler, callback) {
1765
this._object.handler = _nameToContentHandler(handler);
1766
if (callback && typeof(callback) === 'function')
1770
contentType: function(callback) {
1772
callback(_contentTypeToName(this._object.contentType));
1774
setContentType: function(contentType, callback) {
1776
this._object.contentType = _nameToContentType(contentType);
1777
if (callback && typeof(callback) === 'function')
1781
selectionType: function(callback) {
1783
callback(_contentTransferSelectionToName(this._object.selectionType));
1785
setSelectionType: function(selectionType, callback) {
1787
this._object.selectionType = _nameToContentTransferSelection(selectionType);
1788
if (callback && typeof(callback) === 'function')
1793
name: function(callback) {
1795
callback(this._object.name);
1798
isDefaultPeer: function(callback) {
1800
callback(this._object.isDefaultPeer);
1805
request: function(callback) {
1807
var transfer = new ContentTransfer(this._object.request());
1809
if (callback && typeof(callback) === 'function')
1810
callback(transfer.serialize());
1813
requestForStore: function(store, callback) {
1819
if (! backendDelegate.isObjectProxyInfo(store)) {
1820
console.debug('requestForStore: invalid store object proxy')
1821
callback("Invalid store");
1825
var _store = backendDelegate.objectFromId(store.objectid);
1827
callback("Invalid store object (NULL)");
1832
var transfer = new ContentTransfer(this._object.request(_store));
1833
if (callback && typeof(callback) === 'function')
1834
callback(transfer.serialize());
1840
request: function(self) {
1841
return self._object.request();
1846
function ContentPeerModel(filterParams) {
1847
var result = backendDelegate.createQmlObject(
1848
PLUGIN_URI, VERSION, 'ContentPeerModel', filterParams);
1849
this._id = result.id;
1850
this._object = result.object;
1852
this._modelAdaptor = backendDelegate.createModelAdaptorFor(this._object);
1853
this._roles = this._modelAdaptor.roles();
1855
ContentPeerModel.prototype = {
1856
_validate: function() {
1858
throw new TypeError("Invalid object null");
1861
destroy: function() {
1864
this._object.destroy();
1865
this._modelAdaptor.destroy();
1866
backendDelegate.deleteId(this._id);
1870
setContentType: function(contentType, callback) {
1872
this._object.contentType = contentType;
1877
setHandler: function(handler, callback) {
1879
this._object.handler = handler;
1886
return this._object.peers;
1889
// QAbtractListModel prototype
1890
count: function(callback) {
1891
if (!this._modelAdaptor) {
1895
callback(this._modelAdaptor.rowCount());
1899
function _constructorFromName(className) {
1900
var constructorPerName = {
1901
"ContentPeer": ContentPeer,
1902
"ContentStore": ContentStore,
1903
"ContentTransfer": ContentTransfer,
1905
return className in constructorPerName
1906
? constructorPerName[className]
1911
getPeers: function(filters, callback) {
1917
var statement = "import QtQuick 2.0; import Ubuntu.Content 0.1; ContentPeerModel {";
1918
var filterParams = {};
1919
if (filters.contentType) {
1920
statement += " contentType: ContentType." + filters.contentType + ";";
1922
if (filters.handler) {
1923
statement += " handler: ContentHandler." + filters.handler + ";";
1927
var peerModel = Qt.createQmlObject(statement, backendDelegate.parent());
1928
var onPeersFound = function() {
1929
var peers = peerModel.peers;
1931
var wrappedPeers = [];
1932
for (var i = 0; i < peers.length; ++i) {
1933
var wrappedPeer = new ContentPeer(peers[i]);
1934
wrappedPeers.push(wrappedPeer.serialize());
1936
peerModel.onFindPeersCompleted.disconnect(onPeersFound);
1937
callback(wrappedPeers);
1939
peerModel.onFindPeersCompleted.connect(onPeersFound);
1942
getStore: function(scope, callback) {
1947
var store = new ContentStore();
1948
store.setScope(scope);
1949
callback(store.serialize());
1952
launchContentPeerPicker: function(filters, onPeerSelected, onCancelPressed) {
1958
var parentItem = backendDelegate.parentView();
1959
if ( ! parentItem || ! parentItem.visible || ! parentItem.height || ! parentItem.width) {
1960
console.debug("Cannot launch the content peer picker UI, invalid parent item: " + parentItem);
1965
var statement = "import QtQuick 2.0; import Ubuntu.Content 0.1; ContentPeerPicker {";
1966
var filterParams = {};
1967
if (filters.contentType) {
1968
statement += " contentType: ContentType." + filters.contentType + "";
1970
if (filters.handler) {
1971
statement += "; handler: ContentHandler." + filters.handler + "";
1973
if (filters.showTitle) {
1974
statement += "; showTitle: " + filters.showTitle === false ? "false" : "true";
1976
statement += "; visible: true; }";
1978
if (parentItem.parent)
1979
parentItem.visible = false;
1980
var contentPeerPicker = Qt.createQmlObject(statement,
1981
parentItem.parent ? parentItem.parent : parentItem);
1982
function _onPeerSelected() {
1983
var peer = new ContentPeer(contentPeerPicker.peer);
1984
contentPeerPicker.visible = false;
1985
parentItem.visible = true;
1986
onPeerSelected(peer.serialize());
1987
contentPeerPicker.onPeerSelected.disconnect(_onPeerSelected);
1988
contentPeerPicker.destroy();
1990
function _onCancelPressed() {
1991
contentPeerPicker.visible = false;
1992
parentItem.visible = true;
1994
contentPeerPicker.onPeerSelected.disconnect(_onCancelPressed);
1995
contentPeerPicker.destroy();
1998
contentPeerPicker.onPeerSelected.connect(_onPeerSelected);
1999
contentPeerPicker.onCancelPressed.connect(_onCancelPressed);
2002
apiImportContent: function(type, peer, transferOptions, onSuccess, onFailure) {
2003
if (! backendDelegate.isObjectProxyInfo(peer)) {
2004
console.debug('apiImportContent: invalid peer object proxy')
2005
onError("Invalid peer");
2009
var _type = _nameToContentType(type);
2010
var _peer = backendDelegate.objectFromId(peer.objectid);
2012
onError("Invalid peer object (NULL)");
2015
var _transfer = null;
2016
if (transferOptions.scope) {
2017
var store = new ContentStore();
2018
store.setScope(transferOptions.scope);
2019
_transfer = _peer.request(store._object);
2022
_transfer = _peer.request();
2025
if (transferOptions.multipleFiles) {
2026
_transfer.selectionType = ContentHubBridge.ContentTransfer.Multiple;
2029
_transfer.selectionType = ContentHubBridge.ContentTransfer.Single;
2032
var transfer = new ContentTransfer(_transfer)
2033
_transfer.stateChanged.connect(function() {
2034
if (_transfer.state === ContentHubBridge.ContentTransfer.Aborted) {
2035
onFailure("Aborted");
2038
else if (_transfer.state === ContentHubBridge.ContentTransfer.Charged) {
2039
var d = transfer.internal.serializeItems(_transfer);
2041
_transfer.finalize();
2048
onExportRequested: function(callback) {
2049
_contenthub.exportRequested.connect(function(exportTransfer) {
2050
var wrapped = new ContentTransfer(exportTransfer);
2051
callback(wrapped.serialize());
2057
dispatchToObject: function(infos) {
2058
var args = infos.args;
2059
var callback = infos.callback;
2060
var method_name = infos.method_name;
2061
var objectid = infos.objectid;
2062
var class_name = infos.class_name;
2065
args.push(callback);
2067
var o = backendDelegate.objectFromId(objectid);
2069
console.debug('Cannot dispatch to unknown object: ' + objectid);
2073
var Constructor = _constructorFromName(class_name);
2075
var instance = new Constructor(o, objectid);
2077
instance[method_name].apply(instance, args);