Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
21 lines
No EOL
4.8 KiB
JavaScript
21 lines
No EOL
4.8 KiB
JavaScript
;;;'use strict';window.customRingtones=(function(){var ID_PREFIX='custom:';function CustomRingtone(info,dbKey){this._name=info.name;if(info.uniqueNum!==0||info.isExplicitNum){this._name+=' ('+info.uniqueNum+')';}
|
|
this._subtitle=info.subtitle||null;this._id=ID_PREFIX+dbKey;this._blob=info.blob;}
|
|
CustomRingtone.prototype={get name(){return this._name;},get filename(){return this._blob.name;},get subtitle(){return this._subtitle;},get id(){return this._id;},get type(){return'ringtone';},get url(){return this._url||(this._url=URL.createObjectURL(this._blob));},get shareable(){return true;},get deletable(){return true;},remove:function(){return remove(this.id);},getBlob:function(){return Promise.resolve(this._blob);}};function idToDBKey(id){if(id.indexOf(ID_PREFIX)!==0){throw new Error('invalid id: '+id);}
|
|
return parseInt(id.substr(ID_PREFIX.length));}
|
|
var DBNAME='customTones';var DBVERSION=1;var STORENAME='ringtones';var db=null;function withStore(type,callback){if(db){var transaction=db.transaction(STORENAME,type);callback(null,transaction.objectStore(STORENAME),transaction);}else{var openreq=indexedDB.open(DBNAME,DBVERSION);openreq.onerror=function(){console.error('customRingtones: can\'t open database:',openreq.error.name);callback(openreq.error);};openreq.onupgradeneeded=function(){var objStore=openreq.result.createObjectStore(STORENAME,{autoIncrement:true});objStore.createIndex('fullname',['name','subtitle','uniqueNum'],{unique:false});};openreq.onsuccess=function(){db=openreq.result;var transaction=db.transaction(STORENAME,type);callback(null,transaction.objectStore(STORENAME),transaction);};}}
|
|
function uniqueify(info){return new Promise(function(resolve,reject){withStore('readonly',function(err,store){if(err){reject(err);return;}
|
|
var nextUniqueNum=info.uniqueNum||0;var index=store.index('fullname');var req=index.openCursor(IDBKeyRange.bound([info.name,info.subtitle,0],[info.name,info.subtitle,Infinity]));req.onsuccess=function(event){var cursor=event.target.result;if(!cursor||nextUniqueNum<cursor.value.uniqueNum){resolve(nextUniqueNum);return;}
|
|
nextUniqueNum=cursor.value.uniqueNum+1;cursor.continue();};req.onerror=function(){console.error('Error in customRingtones.uniqueify(): ',req.error.name);reject(req.error);};});});}
|
|
function add(info){var cleanedInfo={name:info.name||'',subtitle:info.subtitle||'',blob:info.blob,uniqueNum:0};var m=/^(.*) \((\d+)\)$/.exec(cleanedInfo.name);if(m){cleanedInfo.name=m[1];cleanedInfo.uniqueNum=m[2];cleanedInfo.isExplicitNum=true;}
|
|
return uniqueify(cleanedInfo).then(function(uniqueNum){return new Promise(function(resolve,reject){withStore('readwrite',function(err,store,transaction){if(err){reject(err);return;}
|
|
cleanedInfo.uniqueNum=uniqueNum;var tone;var req=store.add(cleanedInfo);req.onsuccess=function(event){tone=new CustomRingtone(cleanedInfo,event.target.result);};transaction.oncomplete=function(event){resolve(tone);};transaction.onabort=transaction.onerror=function(){console.error('Error in customRingtones.add(): ',transaction.error.name);reject(req.error);};});});});}
|
|
function remove(id){return new Promise(function(resolve,reject){withStore('readwrite',function(err,store,transaction){if(err){reject(err);return;}
|
|
var req=store.delete(idToDBKey(id));transaction.oncomplete=function(event){resolve();};transaction.onabort=transaction.onerror=function(){console.error('Error in customRingtones.remove(): ',transaction.error.name);reject(req.error);};});});}
|
|
function clear(){return new Promise(function(resolve,reject){withStore('readwrite',function(err,store,transaction){if(err){reject(err);return;}
|
|
var req=store.clear();transaction.oncomplete=function(event){resolve();};transaction.onabort=transaction.onerror=function(){console.error('Error in customRingtones.clear(): ',transaction.error.name);reject(req.error);};});});}
|
|
function get(id){return new Promise(function(resolve,reject){withStore('readonly',function(err,store){if(err){reject(err);return;}
|
|
var key=idToDBKey(id);var req=store.get(key);req.onsuccess=function(event){var data=event.target.result;if(!data){resolve(null);}else{resolve(new CustomRingtone(data,key));}};req.onerror=function(){console.error('Error in customRingtones.get(): ',req.error.name);reject(req.error);};});});}
|
|
function list(toneType){return new Promise(function(resolve,reject){if(toneType==='alerttone'){resolve([]);return;}
|
|
withStore('readonly',function(err,store){if(err){reject(err);return;}
|
|
var req=store.openCursor();var results=[];req.onsuccess=function listOnSuccess(event){var cursor=event.target.result;if(cursor){var value=cursor.value;results.push(new CustomRingtone(value,cursor.key));cursor.continue();}else{resolve(results);}};req.onerror=function listOnError(){console.error('Error in customRingtones.list(): ',req.error.name);reject(req.error);};});});}
|
|
return{add:add,remove:remove,clear:clear,get:get,list:list};})(); |