Compare commits
102 Commits
availabili
...
v4.0.14
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e9a8b0a70 | ||
|
|
cdd10ba307 | ||
|
|
81f5324a76 | ||
|
|
a8acec2030 | ||
|
|
60f6bfab13 | ||
|
|
ab5a5045a2 | ||
|
|
792c5ec137 | ||
|
|
ee8d198358 | ||
|
|
7b6a02226c | ||
|
|
fae5bd363b | ||
|
|
1ab308446e | ||
|
|
57f40b281c | ||
|
|
5b4c48d382 | ||
|
|
3ad6ea0ee1 | ||
|
|
b966095e82 | ||
|
|
de9befdda0 | ||
|
|
28dc89e949 | ||
|
|
97d0cee75c | ||
|
|
1fbb89a661 | ||
|
|
74e73bc802 | ||
|
|
015ac6a91d | ||
|
|
0f227fa493 | ||
|
|
d5004403f7 | ||
|
|
708bd92ef7 | ||
|
|
306d5ee529 | ||
|
|
f603454fba | ||
|
|
4e2b8349a2 | ||
|
|
f71f0ad2fe | ||
|
|
3f37063ee8 | ||
|
|
c56f52b2bf | ||
|
|
8e4b301e0a | ||
|
|
b24c929cc0 | ||
|
|
28fdba2a78 | ||
|
|
7d246ab638 | ||
|
|
3a5298287b | ||
|
|
3cd31eee6e | ||
|
|
4b86c43f97 | ||
|
|
6540c0fc63 | ||
|
|
c73eb29b6e | ||
|
|
b78b9890b1 | ||
|
|
6244d68b6a | ||
|
|
ecbf9ff90a | ||
|
|
4a1f1a49a0 | ||
|
|
6c22983f62 | ||
|
|
3ca5c71a0b | ||
|
|
7f06f93e9e | ||
|
|
e99cf5cf49 | ||
|
|
306eb6d319 | ||
|
|
1772f36950 | ||
|
|
77eff3479d | ||
|
|
299c664655 | ||
|
|
d4b19ef0db | ||
|
|
7cf133249e | ||
|
|
033ac60208 | ||
|
|
d8e0be18c8 | ||
|
|
f96bf9eb81 | ||
|
|
b76a335dc9 | ||
|
|
375eae1a5c | ||
|
|
ca216b5296 | ||
|
|
c212d118ba | ||
|
|
292d20595d | ||
|
|
1e7ac8ba15 | ||
|
|
1954f80fa3 | ||
|
|
a5c42edbe5 | ||
|
|
3b465f419a | ||
|
|
0f489e80ad | ||
|
|
95a748152e | ||
|
|
d050e6e04e | ||
|
|
ae3ea39a4c | ||
|
|
943a9a2e09 | ||
|
|
76ccd69cec | ||
|
|
88d95823b2 | ||
|
|
ac4364040d | ||
|
|
b37d318159 | ||
|
|
b11203537e | ||
|
|
a79175330e | ||
|
|
49c17fc391 | ||
|
|
5afdfec91d | ||
|
|
2051a5db5d | ||
|
|
4984a72d0d | ||
|
|
45003593e1 | ||
|
|
f53dd22cd9 | ||
|
|
526e704c9f | ||
|
|
4682846d3e | ||
|
|
95ef80e6db | ||
|
|
4fd069b479 | ||
|
|
2024d424cd | ||
|
|
6d94455540 | ||
|
|
2871896d54 | ||
|
|
e9a63900de | ||
|
|
baab13ae13 | ||
|
|
5192eecce2 | ||
|
|
7581d55428 | ||
|
|
aae17d4ae8 | ||
|
|
a366ba4c0c | ||
|
|
2cfc7f7454 | ||
|
|
e9e84b5c3b | ||
|
|
c32a99b14c | ||
|
|
758ae42df0 | ||
|
|
0970a3c60e | ||
|
|
6b78ca1a5a | ||
|
|
e899c9989e |
11
3rdparty/MDB2/Driver/Manager/pgsql.php
vendored
@@ -363,6 +363,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
|
||||
return MDB2_OK;
|
||||
}
|
||||
|
||||
$unquoted_name = $name;
|
||||
$name = $db->quoteIdentifier($name, true);
|
||||
|
||||
if (!empty($changes['remove']) && is_array($changes['remove'])) {
|
||||
@@ -398,6 +399,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
|
||||
|
||||
if (!empty($changes['change']) && is_array($changes['change'])) {
|
||||
foreach ($changes['change'] as $field_name => $field) {
|
||||
$unquoted_field_name = $field_name;
|
||||
$field_name = $db->quoteIdentifier($field_name, true);
|
||||
if (!empty($field['definition']['type'])) {
|
||||
$server_info = $db->getServerVersion();
|
||||
@@ -419,7 +421,14 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
if (array_key_exists('default', $field['definition'])) {
|
||||
if (array_key_exists('autoincrement', $field['definition'])) {
|
||||
$query = "ALTER $field_name SET DEFAULT nextval(".$db->quote($unquoted_name.'_'.$unquoted_field_name.'_seq', 'text').")";
|
||||
$result = $db->exec("ALTER TABLE $name $query");
|
||||
if (PEAR::isError($result)) {
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
elseif (array_key_exists('default', $field['definition'])) {
|
||||
$query = "ALTER $field_name SET DEFAULT ".$db->quote($field['definition']['default'], $field['definition']['type']);
|
||||
$result = $db->exec("ALTER TABLE $name $query");
|
||||
if (PEAR::isError($result)) {
|
||||
|
||||
3
3rdparty/Sabre/CardDAV/Plugin.php
vendored
@@ -153,6 +153,9 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin {
|
||||
|
||||
// Taking out \r to not screw up the xml output
|
||||
$returnedProperties[200][$addressDataProp] = str_replace("\r","", $val);
|
||||
// The stripping of \r breaks the Mail App in OSX Mountain Lion
|
||||
// this is fixed in master, but not backported. /Tanghus
|
||||
$returnedProperties[200][$addressDataProp] = $val;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
12
3rdparty/Sabre/DAV/Browser/Plugin.php
vendored
@@ -439,12 +439,16 @@ class Sabre_DAV_Browser_Plugin extends Sabre_DAV_ServerPlugin {
|
||||
*/
|
||||
protected function getLocalAssetPath($assetName) {
|
||||
|
||||
$assetDir = realpath(__DIR__ . '/assets') . '/';
|
||||
$path = $assetDir . $assetName;
|
||||
|
||||
// Making sure people aren't trying to escape from the base path.
|
||||
$assetSplit = explode('/', $assetName);
|
||||
if (in_array('..',$assetSplit)) {
|
||||
throw new Sabre_DAV_Exception('Incorrect asset path');
|
||||
$path = realpath($path);
|
||||
|
||||
if ($path === false || substr($path, 0, strlen($assetDir))!==$assetDir) {
|
||||
throw new Sabre_DAV_Exception_Forbidden('Path does not exist, or escaping from the base path was detected');
|
||||
}
|
||||
$path = __DIR__ . '/assets/' . $assetName;
|
||||
|
||||
return $path;
|
||||
|
||||
}
|
||||
|
||||
4
3rdparty/fullcalendar/css/fullcalendar.css
vendored
@@ -1,11 +1,11 @@
|
||||
/*
|
||||
* FullCalendar v1.5.3 Stylesheet
|
||||
* FullCalendar v1.5.4 Stylesheet
|
||||
*
|
||||
* Copyright (c) 2011 Adam Shaw
|
||||
* Dual licensed under the MIT and GPL licenses, located in
|
||||
* MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
||||
*
|
||||
* Date: Mon Feb 6 22:40:40 2012 -0800
|
||||
* Date: Tue Sep 4 23:38:33 2012 -0700
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* FullCalendar v1.5.3 Print Stylesheet
|
||||
* FullCalendar v1.5.4 Print Stylesheet
|
||||
*
|
||||
* Include this stylesheet on your page to get a more printer-friendly calendar.
|
||||
* When including this stylesheet, use the media='print' attribute of the <link> tag.
|
||||
@@ -9,7 +9,7 @@
|
||||
* Dual licensed under the MIT and GPL licenses, located in
|
||||
* MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
||||
*
|
||||
* Date: Mon Feb 6 22:40:40 2012 -0800
|
||||
* Date: Tue Sep 4 23:38:33 2012 -0700
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
38
3rdparty/fullcalendar/js/fullcalendar.js
vendored
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* @preserve
|
||||
* FullCalendar v1.5.3
|
||||
* FullCalendar v1.5.4
|
||||
* http://arshaw.com/fullcalendar/
|
||||
*
|
||||
* Use fullcalendar.css for basic styling.
|
||||
@@ -11,7 +11,7 @@
|
||||
* Dual licensed under the MIT and GPL licenses, located in
|
||||
* MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
||||
*
|
||||
* Date: Mon Feb 6 22:40:40 2012 -0800
|
||||
* Date: Tue Sep 4 23:38:33 2012 -0700
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -111,7 +111,7 @@ var rtlDefaults = {
|
||||
|
||||
|
||||
|
||||
var fc = $.fullCalendar = { version: "1.5.3" };
|
||||
var fc = $.fullCalendar = { version: "1.5.4" };
|
||||
var fcViews = fc.views = {};
|
||||
|
||||
|
||||
@@ -1658,7 +1658,7 @@ function sliceSegs(events, visEventEnds, start, end) {
|
||||
msLength: segEnd - segStart
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
return segs.sort(segCmp);
|
||||
}
|
||||
|
||||
@@ -1742,29 +1742,26 @@ function setOuterHeight(element, height, includeMargins) {
|
||||
}
|
||||
|
||||
|
||||
// TODO: curCSS has been deprecated (jQuery 1.4.3 - 10/16/2010)
|
||||
|
||||
|
||||
function hsides(element, includeMargins) {
|
||||
return hpadding(element) + hborders(element) + (includeMargins ? hmargins(element) : 0);
|
||||
}
|
||||
|
||||
|
||||
function hpadding(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'paddingLeft', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'paddingRight', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'paddingLeft', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'paddingRight', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
function hmargins(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'marginLeft', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'marginRight', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'marginLeft', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'marginRight', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
function hborders(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'borderLeftWidth', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'borderRightWidth', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'borderLeftWidth', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'borderRightWidth', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1774,20 +1771,20 @@ function vsides(element, includeMargins) {
|
||||
|
||||
|
||||
function vpadding(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'paddingTop', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'paddingBottom', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'paddingTop', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'paddingBottom', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
function vmargins(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'marginTop', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'marginBottom', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'marginTop', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'marginBottom', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
function vborders(element) {
|
||||
return (parseFloat($.curCSS(element[0], 'borderTopWidth', true)) || 0) +
|
||||
(parseFloat($.curCSS(element[0], 'borderBottomWidth', true)) || 0);
|
||||
return (parseFloat($.css(element[0], 'borderTopWidth', true)) || 0) +
|
||||
(parseFloat($.css(element[0], 'borderBottomWidth', true)) || 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1956,7 +1953,6 @@ function firstDefined() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
fcViews.month = MonthView;
|
||||
|
||||
function MonthView(element, calendar) {
|
||||
@@ -4662,7 +4658,7 @@ function DayEventRenderer() {
|
||||
"</span>";
|
||||
}
|
||||
html +=
|
||||
"<span class='fc-event-title'>" + event.title + "</span>" +
|
||||
"<span class='fc-event-title'>" + htmlEscape(event.title) + "</span>" +
|
||||
"</div>";
|
||||
if (seg.isEnd && isEventResizable(event)) {
|
||||
html +=
|
||||
|
||||
14
3rdparty/fullcalendar/js/fullcalendar.min.js
vendored
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
|
||||
FullCalendar v1.5.3
|
||||
FullCalendar v1.5.4
|
||||
http://arshaw.com/fullcalendar/
|
||||
|
||||
Use fullcalendar.css for basic styling.
|
||||
@@ -11,7 +11,7 @@
|
||||
Dual licensed under the MIT and GPL licenses, located in
|
||||
MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
||||
|
||||
Date: Mon Feb 6 22:40:40 2012 -0800
|
||||
Date: Tue Sep 4 23:38:33 2012 -0700
|
||||
|
||||
*/
|
||||
(function(m,ma){function wb(a){m.extend(true,Ya,a)}function Yb(a,b,e){function d(k){if(E){u();q();na();S(k)}else f()}function f(){B=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");E=m("<div class='fc-content' style='position:relative'/>").prependTo(a);C=new Zb(X,b);(P=C.render())&&a.prepend(P);y(b.defaultView);m(window).resize(oa);t()||g()}function g(){setTimeout(function(){!n.start&&t()&&S()},0)}function l(){m(window).unbind("resize",oa);C.destroy();
|
||||
@@ -39,10 +39,10 @@ a[12])*1E3);lb(e,b)}else{e.setUTCFullYear(a[1],a[3]?a[3]-1:0,a[5]||1);e.setUTCHo
|
||||
10):0)}}function Oa(a,b,e){return ib(a,null,b,e)}function ib(a,b,e,d){d=d||Ya;var f=a,g=b,l,j=e.length,t,y,S,Q="";for(l=0;l<j;l++){t=e.charAt(l);if(t=="'")for(y=l+1;y<j;y++){if(e.charAt(y)=="'"){if(f){Q+=y==l+1?"'":e.substring(l+1,y);l=y}break}}else if(t=="(")for(y=l+1;y<j;y++){if(e.charAt(y)==")"){l=Oa(f,e.substring(l+1,y),d);if(parseInt(l.replace(/\D/,""),10))Q+=l;l=y;break}}else if(t=="[")for(y=l+1;y<j;y++){if(e.charAt(y)=="]"){t=e.substring(l+1,y);l=Oa(f,t,d);if(l!=Oa(g,t,d))Q+=l;l=y;break}}else if(t==
|
||||
"{"){f=b;g=a}else if(t=="}"){f=a;g=b}else{for(y=j;y>l;y--)if(S=dc[e.substring(l,y)]){if(f)Q+=S(f,d);l=y-1;break}if(y==l)if(f)Q+=t}}return Q}function Ua(a){return a.end?ec(a.end,a.allDay):ba(N(a.start),1)}function ec(a,b){a=N(a);return b||a.getHours()||a.getMinutes()?ba(a,1):Ka(a)}function fc(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function Cb(a,b){return a.end>b.start&&a.start<b.end}function nb(a,b,e,d){var f=[],g,l=a.length,j,t,y,S,Q;for(g=0;g<l;g++){j=a[g];t=j.start;
|
||||
y=b[g];if(y>e&&t<d){if(t<e){t=N(e);S=false}else{t=t;S=true}if(y>d){y=N(d);Q=false}else{y=y;Q=true}f.push({event:j,start:t,end:y,isStart:S,isEnd:Q,msLength:y-t})}}return f.sort(fc)}function ob(a){var b=[],e,d=a.length,f,g,l,j;for(e=0;e<d;e++){f=a[e];for(g=0;;){l=false;if(b[g])for(j=0;j<b[g].length;j++)if(Cb(b[g][j],f)){l=true;break}if(l)g++;else break}if(b[g])b[g].push(f);else b[g]=[f]}return b}function Db(a,b,e){a.unbind("mouseover").mouseover(function(d){for(var f=d.target,g;f!=this;){g=f;f=f.parentNode}if((f=
|
||||
g._fci)!==ma){g._fci=ma;g=b[f];e(g.event,g.element,g);m(d.target).trigger(d)}d.stopPropagation()})}function Va(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.width(Math.max(0,b-pb(f,e)))}}function Eb(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.height(Math.max(0,b-Sa(f,e)))}}function pb(a,b){return gc(a)+hc(a)+(b?ic(a):0)}function gc(a){return(parseFloat(m.curCSS(a[0],"paddingLeft",true))||0)+(parseFloat(m.curCSS(a[0],"paddingRight",true))||0)}function ic(a){return(parseFloat(m.curCSS(a[0],
|
||||
"marginLeft",true))||0)+(parseFloat(m.curCSS(a[0],"marginRight",true))||0)}function hc(a){return(parseFloat(m.curCSS(a[0],"borderLeftWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderRightWidth",true))||0)}function Sa(a,b){return jc(a)+kc(a)+(b?Fb(a):0)}function jc(a){return(parseFloat(m.curCSS(a[0],"paddingTop",true))||0)+(parseFloat(m.curCSS(a[0],"paddingBottom",true))||0)}function Fb(a){return(parseFloat(m.curCSS(a[0],"marginTop",true))||0)+(parseFloat(m.curCSS(a[0],"marginBottom",true))||0)}
|
||||
function kc(a){return(parseFloat(m.curCSS(a[0],"borderTopWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderBottomWidth",true))||0)}function Za(a,b){b=typeof b=="number"?b+"px":b;a.each(function(e,d){d.style.cssText+=";min-height:"+b+";_height:"+b})}function xb(){}function Gb(a,b){return a-b}function Hb(a){return Math.max.apply(Math,a)}function Pa(a){return(a<10?"0":"")+a}function jb(a,b){if(a[b]!==ma)return a[b];b=b.split(/(?=[A-Z])/);for(var e=b.length-1,d;e>=0;e--){d=a[b[e].toLowerCase()];if(d!==
|
||||
ma)return d}return a[""]}function Qa(a){return a.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"<br />")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}
|
||||
g._fci)!==ma){g._fci=ma;g=b[f];e(g.event,g.element,g);m(d.target).trigger(d)}d.stopPropagation()})}function Va(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.width(Math.max(0,b-pb(f,e)))}}function Eb(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.height(Math.max(0,b-Sa(f,e)))}}function pb(a,b){return gc(a)+hc(a)+(b?ic(a):0)}function gc(a){return(parseFloat(m.css(a[0],"paddingLeft",true))||0)+(parseFloat(m.css(a[0],"paddingRight",true))||0)}function ic(a){return(parseFloat(m.css(a[0],"marginLeft",
|
||||
true))||0)+(parseFloat(m.css(a[0],"marginRight",true))||0)}function hc(a){return(parseFloat(m.css(a[0],"borderLeftWidth",true))||0)+(parseFloat(m.css(a[0],"borderRightWidth",true))||0)}function Sa(a,b){return jc(a)+kc(a)+(b?Fb(a):0)}function jc(a){return(parseFloat(m.css(a[0],"paddingTop",true))||0)+(parseFloat(m.css(a[0],"paddingBottom",true))||0)}function Fb(a){return(parseFloat(m.css(a[0],"marginTop",true))||0)+(parseFloat(m.css(a[0],"marginBottom",true))||0)}function kc(a){return(parseFloat(m.css(a[0],
|
||||
"borderTopWidth",true))||0)+(parseFloat(m.css(a[0],"borderBottomWidth",true))||0)}function Za(a,b){b=typeof b=="number"?b+"px":b;a.each(function(e,d){d.style.cssText+=";min-height:"+b+";_height:"+b})}function xb(){}function Gb(a,b){return a-b}function Hb(a){return Math.max.apply(Math,a)}function Pa(a){return(a<10?"0":"")+a}function jb(a,b){if(a[b]!==ma)return a[b];b=b.split(/(?=[A-Z])/);for(var e=b.length-1,d;e>=0;e--){d=a[b[e].toLowerCase()];if(d!==ma)return d}return a[""]}function Qa(a){return a.replace(/&/g,
|
||||
"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"<br />")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}
|
||||
function rb(a,b){a.each(function(e,d){d.className=d.className.replace(/^fc-\w*/,"fc-"+lc[b.getDay()])})}function Jb(a,b){var e=a.source||{},d=a.color,f=e.color,g=b("eventColor"),l=a.backgroundColor||d||e.backgroundColor||f||b("eventBackgroundColor")||g;d=a.borderColor||d||e.borderColor||f||b("eventBorderColor")||g;a=a.textColor||e.textColor||b("eventTextColor");b=[];l&&b.push("background-color:"+l);d&&b.push("border-color:"+d);a&&b.push("color:"+a);return b.join(";")}function $a(a,b,e){if(m.isFunction(a))a=
|
||||
[a];if(a){var d,f;for(d=0;d<a.length;d++)f=a[d].apply(b,e)||f;return f}}function Ta(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==ma)return arguments[a]}function mc(a,b){function e(j,t){if(t){hb(j,t);j.setDate(1)}j=N(j,true);j.setDate(1);t=hb(N(j),1);var y=N(j),S=N(t),Q=f("firstDay"),q=f("weekends")?0:1;if(q){Fa(y);Fa(S,-1,true)}ba(y,-((y.getDay()-Math.max(Q,q)+7)%7));ba(S,(7-S.getDay()+Math.max(Q,q))%7);Q=Math.round((S-y)/(Ab*7));if(f("weekMode")=="fixed"){ba(S,(6-Q)*7);Q=6}d.title=l(j,
|
||||
f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(6,Q,q?5:7,true)}var d=this;d.render=e;sb.call(d,a,b,"month");var f=d.opt,g=d.renderBasic,l=b.formatDate}function nc(a,b){function e(j,t){t&&ba(j,t*7);j=ba(N(j),-((j.getDay()-f("firstDay")+7)%7));t=ba(N(j),7);var y=N(j),S=N(t),Q=f("weekends");if(!Q){Fa(y);Fa(S,-1,true)}d.title=l(y,ba(N(S),-1),f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(1,1,Q?7:5,false)}var d=this;d.render=e;sb.call(d,a,b,"basicWeek");var f=d.opt,g=d.renderBasic,
|
||||
@@ -106,7 +106,7 @@ t,y=-1,S=-1;for(t=0;t<l;t++)if(g>=e[t][0]&&g<e[t][1]){y=t;break}for(t=0;t<j;t++)
|
||||
g=l=null;a.build();b(t);d=y||"mousemove";m(document).bind(d,b)};e.stop=function(){m(document).unbind(d,b);return l}}function xc(a){if(a.pageX===ma){a.pageX=a.originalEvent.pageX;a.pageY=a.originalEvent.pageY}}function Pb(a){function b(l){return d[l]=d[l]||a(l)}var e=this,d={},f={},g={};e.left=function(l){return f[l]=f[l]===ma?b(l).position().left:f[l]};e.right=function(l){return g[l]=g[l]===ma?e.left(l)+b(l).width():g[l]};e.clear=function(){d={};f={};g={}}}var Ya={defaultView:"month",aspectRatio:1.35,
|
||||
header:{left:"title",center:"",right:"today prev,next"},weekends:true,allDayDefault:true,ignoreTimezone:true,lazyFetching:true,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '—'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},isRTL:false,firstDay:0,monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan",
|
||||
"Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],buttonText:{prev:" ◄ ",next:" ► ",prevYear:" << ",nextYear:" >> ",today:"today",month:"month",week:"week",day:"day"},theme:false,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:true,dropAccept:"*"},yc=
|
||||
{header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:" ► ",next:" ◄ ",prevYear:" >> ",nextYear:" << "},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=m.fullCalendar={version:"1.5.3"},Ja=Aa.views={};m.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),e;this.each(function(){var f=m.data(this,"fullCalendar");if(f&&m.isFunction(f[a])){f=f[a].apply(f,
|
||||
{header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:" ► ",next:" ◄ ",prevYear:" >> ",nextYear:" << "},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=m.fullCalendar={version:"1.5.4"},Ja=Aa.views={};m.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),e;this.each(function(){var f=m.data(this,"fullCalendar");if(f&&m.isFunction(f[a])){f=f[a].apply(f,
|
||||
b);if(e===ma)e=f;a=="destroy"&&m.removeData(this,"fullCalendar")}});if(e!==ma)return e;return this}var d=a.eventSources||[];delete a.eventSources;if(a.events){d.push(a.events);delete a.events}a=m.extend(true,{},Ya,a.isRTL||a.isRTL===ma&&Ya.isRTL?yc:{},a);this.each(function(f,g){f=m(g);g=new Yb(f,a,d);f.data("fullCalendar",g);g.render()});return this};Aa.sourceNormalizers=[];Aa.sourceFetchers=[];var ac={dataType:"json",cache:false},bc=1;Aa.addDays=ba;Aa.cloneDate=N;Aa.parseDate=kb;Aa.parseISO8601=
|
||||
Bb;Aa.parseTime=mb;Aa.formatDate=Oa;Aa.formatDates=ib;var lc=["sun","mon","tue","wed","thu","fri","sat"],Ab=864E5,cc=36E5,wc=6E4,dc={s:function(a){return a.getSeconds()},ss:function(a){return Pa(a.getSeconds())},m:function(a){return a.getMinutes()},mm:function(a){return Pa(a.getMinutes())},h:function(a){return a.getHours()%12||12},hh:function(a){return Pa(a.getHours()%12||12)},H:function(a){return a.getHours()},HH:function(a){return Pa(a.getHours())},d:function(a){return a.getDate()},dd:function(a){return Pa(a.getDate())},
|
||||
ddd:function(a,b){return b.dayNamesShort[a.getDay()]},dddd:function(a,b){return b.dayNames[a.getDay()]},M:function(a){return a.getMonth()+1},MM:function(a){return Pa(a.getMonth()+1)},MMM:function(a,b){return b.monthNamesShort[a.getMonth()]},MMMM:function(a,b){return b.monthNames[a.getMonth()]},yy:function(a){return(a.getFullYear()+"").substring(2)},yyyy:function(a){return a.getFullYear()},t:function(a){return a.getHours()<12?"a":"p"},tt:function(a){return a.getHours()<12?"am":"pm"},T:function(a){return a.getHours()<
|
||||
|
||||
4
3rdparty/fullcalendar/js/gcal.js
vendored
@@ -1,11 +1,11 @@
|
||||
/*
|
||||
* FullCalendar v1.5.3 Google Calendar Plugin
|
||||
* FullCalendar v1.5.4 Google Calendar Plugin
|
||||
*
|
||||
* Copyright (c) 2011 Adam Shaw
|
||||
* Dual licensed under the MIT and GPL licenses, located in
|
||||
* MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
|
||||
*
|
||||
* Date: Mon Feb 6 22:40:40 2012 -0800
|
||||
* Date: Tue Sep 4 23:38:33 2012 -0700
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
9
README
@@ -5,9 +5,8 @@ http://ownCloud.org
|
||||
|
||||
Installation instructions: http://owncloud.org/support
|
||||
|
||||
Source code: http://gitorious.org/owncloud
|
||||
Mailing list: http://mail.kde.org/mailman/listinfo/owncloud
|
||||
IRC channel: http://webchat.freenode.net/?channels=owncloud
|
||||
Source code: https://github.com/owncloud
|
||||
Mailing list: https://mail.kde.org/mailman/listinfo/owncloud
|
||||
IRC channel: https://webchat.freenode.net/?channels=owncloud
|
||||
Diaspora: https://joindiaspora.com/u/owncloud
|
||||
Identi.ca: http://identi.ca/owncloud
|
||||
|
||||
Identi.ca: https://identi.ca/owncloud
|
||||
@@ -27,6 +27,8 @@ OCP\App::checkAppEnabled('admin_migrate');
|
||||
|
||||
// Export?
|
||||
if (isset($_POST['admin_export'])) {
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
// Create the export zip
|
||||
$response = json_decode( OC_Migrate::export( null, $_POST['export_type'] ) );
|
||||
if( !$response->success ){
|
||||
@@ -44,6 +46,7 @@ if (isset($_POST['admin_export'])) {
|
||||
}
|
||||
// Import?
|
||||
} else if( isset($_POST['admin_import']) ){
|
||||
OCP\JSON::callCheck();
|
||||
$from = $_FILES['owncloud_import']['tmp_name'];
|
||||
|
||||
if( !OC_Migrate::import( $from, 'instance' ) ){
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
</p>
|
||||
<h3>What would you like to export?</h3>
|
||||
<p>
|
||||
<input type="hidden" name="requesttoken" value="<?php echo $_['requesttoken'] ?>" id="requesttoken">
|
||||
<input type="radio" name="export_type" value="instance" style="width:20px;" /> ownCloud instance (suitable for import )<br />
|
||||
<input type="radio" name="export_type" value="system" style="width:20px;" /> ownCloud system files<br />
|
||||
<input type="radio" name="export_type" value="userfiles" style="width:20px;" /> Just user files<br />
|
||||
|
||||
@@ -141,7 +141,7 @@ function updateBookmarksList(bookmark) {
|
||||
var taglist = '';
|
||||
for ( var i=0, len=tags.length; i<len; ++i ){
|
||||
if(tags[i] != '')
|
||||
taglist = taglist + '<a class="bookmark_tag" href="'+replaceQueryString( String(window.location), 'tag', encodeURIComponent(tags[i])) + '">' + tags[i] + '</a> ';
|
||||
taglist = taglist + '<a class="bookmark_tag" href="'+replaceQueryString(escapeHTML(String(window.location)), 'tag', encodeURIComponent(tags[i])) + '">' + tags[i] + '</a> ';
|
||||
}
|
||||
if(!hasProtocol(bookmark.url)) {
|
||||
bookmark.url = 'http://' + bookmark.url;
|
||||
@@ -158,9 +158,9 @@ function updateBookmarksList(bookmark) {
|
||||
'</span> ' +
|
||||
'</p>' +
|
||||
'<p class="bookmark_title">'+
|
||||
'<a href="' + encodeEntities(bookmark.url) + '" target="_blank" class="bookmark_link">' + encodeEntities(bookmark.title) + '</a>' +
|
||||
'<a href="' + encodeURI(bookmark.url) + '" target="_blank" class="bookmark_link">' + encodeEntities(bookmark.title) + '</a>' +
|
||||
'</p>' +
|
||||
'<p class="bookmark_url"><a href="' + encodeEntities(bookmark.url) + '" target="_blank" class="bookmark_link">' + encodeEntities(bookmark.url) + '</a></p>' +
|
||||
'<p class="bookmark_url"><a href="' + encodeURI(bookmark.url) + '" target="_blank" class="bookmark_link">' + encodeURI(bookmark.url) + '</a></p>' +
|
||||
'</div>'
|
||||
);
|
||||
if(taglist != '') {
|
||||
@@ -198,4 +198,4 @@ function encodeEntities(s){
|
||||
function hasProtocol(url) {
|
||||
var regexp = /(ftp|http|https|sftp)/;
|
||||
return regexp.test(url);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de>
|
||||
* Copyright (c) 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
@@ -19,6 +19,12 @@ if($errarr){
|
||||
exit;
|
||||
}else{
|
||||
$cal = $_POST['calendar'];
|
||||
$calendar = OC_Calendar_Calendar::find($cal);
|
||||
if($calendar['userid'] != OCP\USER::getUser()){
|
||||
$l = OC_L10N::get('core');
|
||||
OC_JSON::error(array( 'data' => array( 'message' => $l->t('Authentication error') )));
|
||||
exit();
|
||||
}
|
||||
$vcalendar = OC_Calendar_Object::createVCalendarFromRequest($_POST);
|
||||
$result = OC_Calendar_Object::add($cal, $vcalendar->serialize());
|
||||
OCP\JSON::success();
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
OCP\JSON::checkLoggedIn();
|
||||
OCP\JSON::checkAppEnabled('calendar');
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
$l = OC_L10N::get('calendar');
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ $l=OC_L10N::get('calendar');
|
||||
// Check if we are a user
|
||||
OCP\JSON::checkLoggedIn();
|
||||
OCP\JSON::checkAppEnabled('calendar');
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
// Get data
|
||||
if( isset( $_POST['timezone'] ) ){
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
OCP\JSON::checkLoggedIn();
|
||||
OCP\JSON::checkAppEnabled('calendar');
|
||||
OCP\JSON::callCheck();
|
||||
|
||||
if(array_key_exists('timezonedetection', $_POST) && $_POST['timezonedetection'] == 'on'){
|
||||
OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'timezonedetection', 'true');
|
||||
}else{
|
||||
|
||||
@@ -21,10 +21,17 @@ $principalBackend = new OC_Connector_Sabre_Principal();
|
||||
$caldavBackend = new OC_Connector_Sabre_CalDAV();
|
||||
|
||||
// Root nodes
|
||||
$nodes = array(
|
||||
new Sabre_CalDAV_Principal_Collection($principalBackend),
|
||||
new Sabre_CalDAV_CalendarRootNode($principalBackend, $caldavBackend),
|
||||
);
|
||||
$Sabre_CalDAV_Principal_Collection = new Sabre_CalDAV_Principal_Collection($principalBackend);
|
||||
$Sabre_CalDAV_Principal_Collection->disableListing = true; // Disable listening
|
||||
|
||||
$Sabre_CalDAV_CalendarRootNode = new Sabre_CalDAV_CalendarRootNode($principalBackend, $caldavBackend);
|
||||
$Sabre_CalDAV_CalendarRootNode->disableListing = true; // Disable listening
|
||||
|
||||
$nodes = array(
|
||||
$Sabre_CalDAV_Principal_Collection,
|
||||
$Sabre_CalDAV_CalendarRootNode,
|
||||
);
|
||||
|
||||
|
||||
// Fire up server
|
||||
$server = new Sabre_DAV_Server($nodes);
|
||||
|
||||
@@ -718,7 +718,7 @@ function ListView(element, calendar) {
|
||||
' class="' + classes.join(' ') + '"' +
|
||||
'>' +
|
||||
'<span class="fc-event-title">' +
|
||||
event.title +
|
||||
escapeHTML(event.title) +
|
||||
'</span>' +
|
||||
'</span>' +
|
||||
'</td>' +
|
||||
|
||||
@@ -383,8 +383,8 @@ class OC_Calendar_App{
|
||||
$lastmodified = ($last_modified)?$last_modified->getDateTime()->format('U'):0;
|
||||
|
||||
$output = array('id'=>(int)$event['id'],
|
||||
'title' => htmlspecialchars(($event['summary']!=NULL || $event['summary'] != '')?$event['summary']: self::$l10n->t('unnamed')),
|
||||
'description' => isset($vevent->DESCRIPTION)?htmlspecialchars($vevent->DESCRIPTION->value):'',
|
||||
'title' => ($event['summary']!=NULL || $event['summary'] != '')?$event['summary']: self::$l10n->t('unnamed'),
|
||||
'description' => isset($vevent->DESCRIPTION)?$vevent->DESCRIPTION->value:'',
|
||||
'lastmodified'=>$lastmodified);
|
||||
|
||||
$dtstart = $vevent->DTSTART;
|
||||
|
||||
@@ -35,7 +35,11 @@ $tmpfile = md5(rand());
|
||||
|
||||
// If it is a Drag'n'Drop transfer it's handled here.
|
||||
$fn = (isset($_SERVER['HTTP_X_FILE_NAME']) ? $_SERVER['HTTP_X_FILE_NAME'] : false);
|
||||
$fn = strtr($fn, array('/' => '', "\\" => ''));
|
||||
if($fn) {
|
||||
if(OC_Filesystem::isFileBlacklisted($fn)) {
|
||||
bailOut($l10n->t('Upload of blacklisted file:') . $fn);
|
||||
}
|
||||
if($view->file_put_contents('/'.$tmpfile, file_get_contents('php://input'))) {
|
||||
OCP\JSON::success(array('data' => array('path'=>'', 'file'=>$tmpfile)));
|
||||
exit();
|
||||
@@ -66,6 +70,10 @@ $file=$_FILES['importfile'];
|
||||
|
||||
$tmpfname = tempnam(get_temp_dir(), "occOrig");
|
||||
if(file_exists($file['tmp_name'])) {
|
||||
$filename = strtr($file['name'], array('/' => '', "\\" => ''));
|
||||
if(OC_Filesystem::isFileBlacklisted($filename)) {
|
||||
bailOut($l10n->t('Upload of blacklisted file:') . $filename);
|
||||
}
|
||||
if($view->file_put_contents('/'.$tmpfile, file_get_contents($file['tmp_name']))) {
|
||||
OCP\JSON::success(array('data' => array('path'=>'', 'file'=>$tmpfile)));
|
||||
} else {
|
||||
|
||||
@@ -36,10 +36,16 @@ $principalBackend = new OC_Connector_Sabre_Principal();
|
||||
$carddavBackend = new OC_Connector_Sabre_CardDAV();
|
||||
|
||||
// Root nodes
|
||||
$nodes = array(
|
||||
new Sabre_CalDAV_Principal_Collection($principalBackend),
|
||||
new Sabre_CardDAV_AddressBookRoot($principalBackend, $carddavBackend),
|
||||
);
|
||||
$Sabre_CalDAV_Principal_Collection = new Sabre_CalDAV_Principal_Collection($principalBackend);
|
||||
$Sabre_CalDAV_Principal_Collection->disableListing = true; // Disable listening
|
||||
|
||||
$Sabre_CardDAV_AddressBookRoot = new Sabre_CardDAV_AddressBookRoot($principalBackend, $carddavBackend);
|
||||
$Sabre_CardDAV_AddressBookRoot->disableListing = true; // Disable listening
|
||||
|
||||
$nodes = array(
|
||||
$Sabre_CalDAV_Principal_Collection,
|
||||
$Sabre_CardDAV_AddressBookRoot,
|
||||
);
|
||||
|
||||
// Fire up server
|
||||
$server = new Sabre_DAV_Server($nodes);
|
||||
|
||||
@@ -25,11 +25,16 @@ function writeProgress($pct) {
|
||||
}
|
||||
writeProgress('10');
|
||||
$view = $file = null;
|
||||
$inputfile = strtr($_POST['file'], array('/' => '', "\\" => ''));
|
||||
if(OC_Filesystem::isFileBlacklisted($inputfile)) {
|
||||
OCP\JSON::error(array('data' => array('message' => 'Upload of blacklisted file: ' . $inputfile)));
|
||||
exit();
|
||||
}
|
||||
if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') {
|
||||
$view = OCP\Files::getStorage('contacts');
|
||||
$file = $view->file_get_contents('/' . $_POST['file']);
|
||||
$file = $view->file_get_contents('/' . $inputfile);
|
||||
} else {
|
||||
$file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $_POST['file']);
|
||||
$file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $inputfile);
|
||||
}
|
||||
if(!$file) {
|
||||
OCP\JSON::error(array('message' => 'Import file was empty.'));
|
||||
@@ -115,7 +120,7 @@ if(count($parts) == 1){
|
||||
$imported = 0;
|
||||
$failed = 0;
|
||||
if(!count($importready) > 0) {
|
||||
OCP\JSON::error(array('data' => (array('message' => 'No contacts to import in .'.$_POST['file'].' Please check if the file is corrupted.'))));
|
||||
OCP\JSON::error(array('data' => (array('message' => 'No contacts to import in .'.$inputfile.' Please check if the file is corrupted.'))));
|
||||
exit();
|
||||
}
|
||||
foreach($importready as $import){
|
||||
@@ -135,8 +140,8 @@ if(is_writable('import_tmp/')){
|
||||
unlink($progressfile);
|
||||
}
|
||||
if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') {
|
||||
if(!$view->unlink('/' . $_POST['file'])) {
|
||||
OCP\Util::writeLog('contacts','Import: Error unlinking OC_FilesystemView ' . '/' . $_POST['file'], OCP\Util::ERROR);
|
||||
if(!$view->unlink('/' . $inputfile)) {
|
||||
OCP\Util::writeLog('contacts','Import: Error unlinking OC_FilesystemView ' . '/' . $inputfile, OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
OCP\JSON::success(array('data' => array('imported'=>$imported, 'failed'=>$failed)));
|
||||
|
||||
@@ -219,6 +219,7 @@ class OC_Contacts_Addressbook{
|
||||
OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:active:, exception: '.$e->getMessage(),OCP\Util::DEBUG);
|
||||
OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:active, ids: '.join(',', $active),OCP\Util::DEBUG);
|
||||
OCP\Util::writeLog('contacts','OC_Contacts_Addressbook::active, SQL:'.$prep,OCP\Util::DEBUG);
|
||||
return array();
|
||||
}
|
||||
|
||||
return $addressbooks;
|
||||
|
||||
@@ -315,6 +315,9 @@ class OC_Contacts_VCard{
|
||||
*/
|
||||
public static function addFromDAVData($id,$uri,$data){
|
||||
$card = OC_VObject::parse($data);
|
||||
if(!$card) {
|
||||
return false;
|
||||
}
|
||||
return self::add($id, $card, $uri);
|
||||
}
|
||||
|
||||
|
||||
4
apps/external/templates/settings.php
vendored
@@ -6,8 +6,8 @@
|
||||
<?php
|
||||
$sites = OC_External::getSites();
|
||||
for($i = 0; $i < sizeof($sites); $i++) {
|
||||
echo '<li><input type="text" name="site_name[]" class="site_name" value="'.$sites[$i][0].'" placeholder="'.$l->t('Name').'" />
|
||||
<input type="text" class="site_url" name="site_url[]" value="'.$sites[$i][1].'" placeholder="'.$l->t('URL').'" />
|
||||
echo '<li><input type="text" name="site_name[]" class="site_name" value="'.OC_Util::sanitizeHTML($sites[$i][0]).'" placeholder="'.$l->t('Name').'" />
|
||||
<input type="text" class="site_url" name="site_url[]" value="'.OC_Util::sanitizeHTML($sites[$i][1]).'" placeholder="'.$l->t('URL').'" />
|
||||
<img class="svg action delete_button" src="'.OCP\image_path("", "actions/delete.svg") .'" title="'.$l->t("Remove site").'" />
|
||||
</li>';
|
||||
}
|
||||
|
||||
@@ -39,7 +39,8 @@ OCP\App::setActiveNavigationEntry( 'files_index' );
|
||||
$dir = isset( $_GET['dir'] ) ? stripslashes($_GET['dir']) : '';
|
||||
// Redirect if directory does not exist
|
||||
if(!OC_Filesystem::is_dir($dir.'/')) {
|
||||
header('Location: '.$_SERVER['PHP_SELF'].'');
|
||||
header('Location: '.$_SERVER['SCRIPT_NAME'].'');
|
||||
exit();
|
||||
}
|
||||
|
||||
$files = array();
|
||||
|
||||
@@ -14,9 +14,9 @@ FileList={
|
||||
var extension=false;
|
||||
}
|
||||
html+='<td class="filename" style="background-image:url('+img+')"><input type="checkbox" />';
|
||||
html+='<a class="name" href="download.php?file='+$('#dir').val().replace(/</, '<').replace(/>/, '>')+'/'+name+'"><span class="nametext">'+basename
|
||||
html+='<a class="name" href="download.php?file='+$('#dir').val().replace(/</, '<').replace(/>/, '>')+'/'+escapeHTML(name)+'"><span class="nametext">'+escapeHTML(basename)
|
||||
if(extension){
|
||||
html+='<span class="extension">'+extension+'</span>';
|
||||
html+='<span class="extension">'+escapeHTML(extension)+'</span>';
|
||||
}
|
||||
html+='</span></a></td>';
|
||||
if(size!='Pending'){
|
||||
@@ -166,23 +166,15 @@ FileList={
|
||||
},
|
||||
do_delete:function(files){
|
||||
if(FileList.deleteFiles || !FileList.useUndo){//finish any ongoing deletes first
|
||||
if(!FileList.deleteFiles) {
|
||||
FileList.prepareDeletion(files);
|
||||
}
|
||||
FileList.finishDelete(function(){
|
||||
FileList.do_delete(files);
|
||||
});
|
||||
return;
|
||||
}
|
||||
if(files.substr){
|
||||
files=[files];
|
||||
}
|
||||
$.each(files,function(index,file){
|
||||
var files = $('tr').filterAttr('data-file',file);
|
||||
files.hide();
|
||||
files.find('input[type="checkbox"]').removeAttr('checked');
|
||||
files.removeClass('selected');
|
||||
});
|
||||
procesSelection();
|
||||
FileList.deleteCanceled=false;
|
||||
FileList.deleteFiles=files;
|
||||
FileList.prepareDeletion(files);
|
||||
$('#notification').text(t('files','undo deletion'));
|
||||
$('#notification').data('deletefile',true);
|
||||
$('#notification').fadeIn();
|
||||
@@ -209,6 +201,20 @@ FileList={
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
prepareDeletion:function(files){
|
||||
if(files.substr){
|
||||
files=[files];
|
||||
}
|
||||
$.each(files,function(index,file){
|
||||
var files = $('tr').filterAttr('data-file',file);
|
||||
files.hide();
|
||||
files.find('input[type="checkbox"]').removeAttr('checked');
|
||||
files.removeClass('selected');
|
||||
});
|
||||
procesSelection();
|
||||
FileList.deleteCanceled=false;
|
||||
FileList.deleteFiles=files;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php for($i=0; $i<count($_["breadcrumb"]); $i++):
|
||||
$crumb = $_["breadcrumb"][$i]; ?>
|
||||
<div class="crumb <?php if($i == count($_["breadcrumb"])-1) echo 'last';?> svg" data-dir='<?php echo $crumb["dir"];?>' style='background-image:url("<?php echo OCP\image_path('core','breadcrumb.png');?>")'>
|
||||
<a href="<?php echo $_['baseURL'].$crumb["dir"]; ?>"><?php echo htmlentities($crumb["name"],ENT_COMPAT,'utf-8'); ?></a>
|
||||
<div class="crumb <?php if($i == count($_["breadcrumb"])-1) echo 'last';?> svg" data-dir='<?php echo urlencode($crumb["dir"]);?>' style='background-image:url("<?php echo OCP\image_path('core','breadcrumb.png');?>")'>
|
||||
<a href="<?php echo $_['baseURL'].urlencode($crumb["dir"]); ?>"><?php echo OCP\Util::sanitizeHTML($crumb["name"]); ?></a>
|
||||
</div>
|
||||
<?php endfor;?>
|
||||
<?php endfor;?>
|
||||
@@ -6,6 +6,8 @@
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
OC_Util::checkAdminUser();
|
||||
|
||||
$tmpl = new OCP\Template( 'files_encryption', 'settings');
|
||||
$blackList=explode(',',OCP\Config::getAppValue('files_encryption','type_blacklist','jpg,png,jpeg,avi,mpg,mpeg,mkv,mp3,oga,ogv,ogg'));
|
||||
$enabled=(OCP\Config::getAppValue('files_encryption','enable_encryption','true')=='true');
|
||||
|
||||
@@ -19,7 +19,15 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{
|
||||
$this->host=$params['host'];
|
||||
$this->user=$params['user'];
|
||||
$this->password=$params['password'];
|
||||
$this->secure=isset($params['secure'])?(bool)$params['secure']:false;
|
||||
if(isset($params['secure'])){
|
||||
if(is_string($params['secure'])){
|
||||
$this->secure = ($params['secure'] === 'true');
|
||||
}else{
|
||||
$this->secure = (bool)$params['secure'];
|
||||
}
|
||||
}else{
|
||||
$this->secure = false;
|
||||
}
|
||||
$this->root=isset($params['root'])?$params['root']:'/';
|
||||
if(!$this->root || $this->root[0]!='/'){
|
||||
$this->root='/'.$this->root;
|
||||
|
||||
@@ -268,7 +268,15 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
|
||||
$this->host=$params['host'];
|
||||
$this->user=$params['user'];
|
||||
$this->root=isset($params['root'])?$params['root']:'/';
|
||||
$this->secure=isset($params['secure'])?(bool)$params['secure']:true;
|
||||
if(isset($params['secure'])){
|
||||
if(is_string($params['secure'])){
|
||||
$this->secure = ($params['secure'] === 'true');
|
||||
}else{
|
||||
$this->secure = (bool)$params['secure'];
|
||||
}
|
||||
}else{
|
||||
$this->secure = false;
|
||||
}
|
||||
if(!$this->root || $this->root[0]!='/'){
|
||||
$this->root='/'.$this->root;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,15 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{
|
||||
$this->host=$params['host'];
|
||||
$this->user=$params['user'];
|
||||
$this->password=$params['password'];
|
||||
$this->secure=isset($params['secure'])?(bool)$params['secure']:false;
|
||||
if(isset($params['secure'])){
|
||||
if(is_string($params['secure'])){
|
||||
$this->secure = ($params['secure'] === 'true');
|
||||
}else{
|
||||
$this->secure = (bool)$params['secure'];
|
||||
}
|
||||
}else{
|
||||
$this->secure = false;
|
||||
}
|
||||
$this->root=isset($params['root'])?$params['root']:'/';
|
||||
if(!$this->root || $this->root[0]!='/'){
|
||||
$this->root='/'.$this->root;
|
||||
|
||||
@@ -25,6 +25,24 @@ if(!is_array($config) or !isset($config['ftp']) or !$config['ftp']['run']){
|
||||
public function tearDown(){
|
||||
OCP\Files::rmdirr($this->instance->constructUrl(''));
|
||||
}
|
||||
|
||||
public function testConstructUrl(){
|
||||
$config = array ( 'host' => 'localhost', 'user' => 'ftp', 'password' => 'ftp', 'root' => '/', 'secure' => false );
|
||||
$instance = new OC_Filestorage_FTP($config);
|
||||
$this->assertEqual('ftp://ftp:ftp@localhost/', $instance->constructUrl(''));
|
||||
|
||||
$config['secure'] = true;
|
||||
$instance = new OC_Filestorage_FTP($config);
|
||||
$this->assertEqual('ftps://ftp:ftp@localhost/', $instance->constructUrl(''));
|
||||
|
||||
$config['secure'] = 'false';
|
||||
$instance = new OC_Filestorage_FTP($config);
|
||||
$this->assertEqual('ftp://ftp:ftp@localhost/', $instance->constructUrl(''));
|
||||
|
||||
$config['secure'] = 'true';
|
||||
$instance = new OC_Filestorage_FTP($config);
|
||||
$this->assertEqual('ftps://ftp:ftp@localhost/', $instance->constructUrl(''));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
cd webodf
|
||||
git pull
|
||||
cd ..
|
||||
rm -rf webodf
|
||||
git clone https://git.gitorious.org/odfkit/webodf.git
|
||||
rm -Rf build
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ../webodf
|
||||
make webodf.js webodf-debug.js
|
||||
cp webodf/webodf*.js ../../js/
|
||||
cd ..
|
||||
rm -rf webodf
|
||||
rm -rf build
|
||||
17
apps/files_odfviewer/src/webodf/.gitignore
vendored
@@ -1,17 +0,0 @@
|
||||
#android/bin
|
||||
#android/gen
|
||||
nativeQtClient/nativeQtClient.pro.user
|
||||
programs/firefoxextension/content/webodf.js
|
||||
programs/firefoxextension/content/webodf.css
|
||||
programs/firefoxextension/install.rdf
|
||||
programs/ios/WebODF.xcodeproj/project.xcworkspace
|
||||
programs/ios/WebODF.xcodeproj/xcuserdata
|
||||
programs/ios/www/ZoomIn.png
|
||||
programs/ios/www/ZoomOut.png
|
||||
programs/ios/www/app/
|
||||
programs/ios/www/sencha-touch.css
|
||||
programs/ios/www/sencha-touch.js
|
||||
programs/ios/www/webodf.css
|
||||
programs/ios/www/webodf.js
|
||||
.DS_Store
|
||||
programs/ios/build/
|
||||
9
apps/files_odfviewer/src/webodf/.gitmodules
vendored
@@ -1,9 +0,0 @@
|
||||
[submodule "webodf/extjs"]
|
||||
path = webodf/extjs
|
||||
url = git://github.com/probonogeek/extjs.git
|
||||
[submodule "simplerevisionserver/pywebdav"]
|
||||
path = simplerevisionserver/pywebdav
|
||||
url = ssh://vandenoever@heap.kogmbh.net/srv/git/pywebdav
|
||||
[submodule "extjs"]
|
||||
path = extjs
|
||||
url = git://github.com/probonogeek/extjs.git
|
||||
@@ -1,160 +0,0 @@
|
||||
# WebODF is mostly a JavaScript project. CMake needs to know about the C++ parts
|
||||
project (WebODF C CXX)
|
||||
# version 2.8.2 is needed to have support for zip files in external projects
|
||||
cmake_minimum_required(VERSION 2.8.2)
|
||||
|
||||
# At this point, the version number that is used throughout is defined
|
||||
set(WEBODF_VERSION 0.3.0)
|
||||
|
||||
# This makefile 'compiles' WebODF using various tools, instruments the code and
|
||||
# builds and packages programs that use WebODF.
|
||||
|
||||
# Find installed dependencies
|
||||
find_package(Qt4 4.7.0 COMPONENTS QtCore QtGui QtXml QtNetwork QtWebKit)
|
||||
if (NOT QT4_FOUND)
|
||||
message(WARNING "Qt4 with modules QtCore QtGui QtXml QtNetwork QtWebKit was not found. qtjsruntime will no be built.")
|
||||
endif (NOT QT4_FOUND)
|
||||
|
||||
# java runtime is needed for Closure Compiler
|
||||
find_package(Java COMPONENTS Runtime)
|
||||
|
||||
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
||||
message(FATAL_ERROR "Compiling in the source directortory is not supported. Use for example 'mkdir build; cd build; cmake ..'.")
|
||||
endif (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
||||
|
||||
# Tools must be obtained to work with:
|
||||
include (ExternalProject)
|
||||
|
||||
if(Java_JAVA_EXECUTABLE)
|
||||
# Closure Compiler
|
||||
ExternalProject_Add(
|
||||
ClosureCompiler
|
||||
URL "http://closure-compiler.googlecode.com/files/compiler-20120305.tar.gz"
|
||||
URL_MD5 513344df6f18bfa00b17f034cabf897d
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
)
|
||||
set(CLOSURE_JAR ${CMAKE_BINARY_DIR}/ClosureCompiler-prefix/src/ClosureCompiler/compiler.jar)
|
||||
endif(Java_JAVA_EXECUTABLE)
|
||||
|
||||
# Rhino
|
||||
if(Java_JAVA_EXECUTABLE)
|
||||
ExternalProject_Add(
|
||||
Rhino
|
||||
URL "http://ftp.mozilla.org/pub/js/rhino1_7R3.zip"
|
||||
URL_MD5 99d94103662a8d0b571e247a77432ac5
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
)
|
||||
set(RHINO ${CMAKE_BINARY_DIR}/Rhino-prefix/src/Rhino/js.jar)
|
||||
endif(Java_JAVA_EXECUTABLE)
|
||||
|
||||
# JSDoc
|
||||
ExternalProject_Add(
|
||||
JsDoc
|
||||
URL "http://jsdoc-toolkit.googlecode.com/files/jsdoc_toolkit-2.4.0.zip"
|
||||
URL_MD5 a8f78f5ecd24b54501147b2af341a231
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
)
|
||||
set(JSDOCDIR ${CMAKE_BINARY_DIR}/JsDoc-prefix/src/JsDoc/jsdoc-toolkit)
|
||||
|
||||
# Node.JS
|
||||
ExternalProject_Add(
|
||||
NodeJS
|
||||
URL "http://nodejs.org/dist/v0.6.15/node-v0.6.15.tar.gz"
|
||||
URL_MD5 852cfb1ed8125a4cdba456446d869d19
|
||||
CONFIGURE_COMMAND "./configure"
|
||||
BUILD_IN_SOURCE 1
|
||||
INSTALL_COMMAND ""
|
||||
)
|
||||
set(NODE ${CMAKE_BINARY_DIR}/NodeJS-prefix/src/NodeJS/out/Release/node)
|
||||
|
||||
# JSCoverage
|
||||
ExternalProject_Add(
|
||||
JSCoverage
|
||||
URL "http://siliconforks.com/jscoverage/download/jscoverage-0.5.1.tar.bz2"
|
||||
URL_MD5 a70d79a6759367fbcc0bcc18d6866ff3
|
||||
PATCH_COMMAND patch -p0 < ${CMAKE_CURRENT_SOURCE_DIR}/JSCoverage.patch
|
||||
CONFIGURE_COMMAND "./configure"
|
||||
BUILD_IN_SOURCE 1
|
||||
INSTALL_COMMAND ""
|
||||
)
|
||||
set(JSCOVERAGE ${CMAKE_BINARY_DIR}/JSCoverage-prefix/src/JSCoverage/jscoverage)
|
||||
|
||||
# Android
|
||||
if (NOT ANDROID_SDK_DIR)
|
||||
find_path(ANDROID_SDK_DIR platform-tools/aapt)
|
||||
endif(NOT ANDROID_SDK_DIR)
|
||||
if (NOT ANT)
|
||||
find_file(ANT NAMES ant ant.exe /usr/bin /usr/local/bin)
|
||||
endif(NOT ANT)
|
||||
|
||||
|
||||
|
||||
set(LIBJSFILES lib/packages.js lib/runtime.js lib/core/Base64.js
|
||||
lib/core/RawDeflate.js lib/core/ByteArray.js
|
||||
lib/core/ByteArrayWriter.js lib/core/RawInflate.js
|
||||
lib/core/Cursor.js lib/core/UnitTester.js
|
||||
lib/core/PointWalker.js lib/core/Async.js
|
||||
lib/core/Zip.js
|
||||
|
||||
lib/xmldom/LSSerializerFilter.js lib/xmldom/LSSerializer.js
|
||||
lib/xmldom/RelaxNGParser.js lib/xmldom/RelaxNG.js
|
||||
lib/xmldom/RelaxNG2.js lib/xmldom/OperationalTransformInterface.js
|
||||
lib/xmldom/OperationalTransformDOM.js
|
||||
lib/xmldom/XPath.js
|
||||
|
||||
lib/odf/StyleInfo.js lib/odf/Style2CSS.js
|
||||
lib/odf/FontLoader.js lib/odf/OdfContainer.js
|
||||
lib/odf/Formatting.js lib/odf/OdfCanvas.js
|
||||
|
||||
lib/gui/PresenterUI.js lib/gui/Caret.js
|
||||
lib/gui/SelectionMover.js lib/gui/XMLEdit.js
|
||||
|
||||
lib/manifest.js
|
||||
)
|
||||
|
||||
set(HTML5UIFILES
|
||||
app/app.js app/controller/Files.js app/model/FileSystem.js
|
||||
app/views/FileDetail.js app/views/FilesList.js app/views/OdfView.js
|
||||
app/views/Viewport.js sencha-touch.css sencha-touch.js
|
||||
app/store/FileStore.js
|
||||
ZoomOut.png ZoomIn.png go-previous.png go-next.png
|
||||
zoom-fit-width.png zoom-fit-best.png zoom-fit-height.png
|
||||
)
|
||||
|
||||
add_subdirectory(webodf)
|
||||
add_subdirectory(programs)
|
||||
|
||||
# package webodf
|
||||
set(WEBODFZIP webodf-${WEBODF_VERSION}.zip)
|
||||
set(WEBODFZIP_FILES
|
||||
${CMAKE_BINARY_DIR}/webodf/webodf-debug.js
|
||||
${CMAKE_BINARY_DIR}/webodf/webodf.js
|
||||
${CMAKE_SOURCE_DIR}/webodf/webodf.css
|
||||
)
|
||||
add_custom_command(
|
||||
OUTPUT ${WEBODFZIP}
|
||||
# zip using javascript code running in node.js
|
||||
COMMAND ${NODE} ARGS webodf/lib/runtime.js packwebodf.js
|
||||
${CMAKE_BINARY_DIR}/${WEBODFZIP}
|
||||
#input files
|
||||
${WEBODFZIP_FILES}
|
||||
#output files
|
||||
webodf-debug.js
|
||||
webodf.js
|
||||
webodf.css
|
||||
DEPENDS NodeJS
|
||||
packwebodf.js
|
||||
${WEBODFZIP_FILES}
|
||||
webodf-debug.js
|
||||
webodf.js
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
)
|
||||
add_custom_target(zip ALL DEPENDS ${WEBODFZIP})
|
||||
|
||||
# vim:expandtab
|
||||
@@ -1,13 +0,0 @@
|
||||
--- ./util.c_ 2011-04-20 11:22:46.558521731 +0200
|
||||
+++ ./util.c 2011-04-20 11:23:23.999880771 +0200
|
||||
@@ -478,6 +478,10 @@
|
||||
p->next = head;
|
||||
head = p;
|
||||
}
|
||||
+ else if (S_ISDIR(buf.st_mode)) {
|
||||
+ head = recursive_dir_list(root, entry_wrt_root, head);
|
||||
+ free(entry_wrt_root);
|
||||
+ }
|
||||
else {
|
||||
fatal("refusing to follow symbolic link: %s", entry);
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) 2011 KO GmbH <jos.van.den.oever@kogmbh.com>
|
||||
* @licstart
|
||||
* The JavaScript code in this page is free software: you can redistribute it
|
||||
* and/or modify it under the terms of the GNU Affero General Public License
|
||||
* (GNU AGPL) as published by the Free Software Foundation, either version 3 of
|
||||
* the License, or (at your option) any later version. The code is distributed
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details.
|
||||
*
|
||||
* As additional permission under GNU AGPL version 3 section 7, you
|
||||
* may distribute non-source (e.g., minimized or compacted) forms of
|
||||
* that code without the copy of the GNU GPL normally required by
|
||||
* section 4, provided you include this license notice and a URL
|
||||
* through which recipients can access the Corresponding Source.
|
||||
*
|
||||
* As a special exception to the AGPL, any HTML file which merely makes function
|
||||
* calls to this code, and for that purpose includes it by reference shall be
|
||||
* deemed a separate work for copyright law purposes. In addition, the copyright
|
||||
* holders of this code give you permission to combine this code with free
|
||||
* software libraries that are released under the GNU LGPL. You may copy and
|
||||
* distribute such a system following the terms of the GNU AGPL for this code
|
||||
* and the LGPL for the libraries. If you modify this code, you may extend this
|
||||
* exception to your version of the code, but you are not obligated to do so.
|
||||
* If you do not wish to do so, delete this exception statement from your
|
||||
* version.
|
||||
*
|
||||
* This license applies to this entire compilation.
|
||||
* @licend
|
||||
* @source: http://www.webodf.org/
|
||||
* @source: http://gitorious.org/odfkit/webodf/
|
||||
*/
|
||||
/*global runtime: true, core: true*/
|
||||
runtime.loadClass("core.Zip");
|
||||
runtime.loadClass("core.Base64");
|
||||
|
||||
function addFiles(zip, pos, inputfiles, zipfiles, callback) {
|
||||
"use strict";
|
||||
if (inputfiles.length !== zipfiles.length) {
|
||||
return callback(
|
||||
"Arrays inputfiles and zipfiles should have the same length.");
|
||||
}
|
||||
if (pos >= inputfiles.length) {
|
||||
zip.write(function (err) {
|
||||
return callback(err);
|
||||
});
|
||||
return;
|
||||
}
|
||||
var inputfile = inputfiles[pos],
|
||||
zipmemberpath = zipfiles[pos];
|
||||
runtime.readFile(inputfile, "binary", function (err, data) {
|
||||
var base64;
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
zip.save(zipmemberpath, data, false, new Date());
|
||||
addFiles(zip, pos + 1, inputfiles, zipfiles, callback);
|
||||
});
|
||||
}
|
||||
|
||||
function usage() {
|
||||
"use strict";
|
||||
runtime.log("Usage:");
|
||||
}
|
||||
|
||||
/**
|
||||
* This script takes 1+2n arguments
|
||||
* First argument is the name of the target zip file.
|
||||
* The next n arguments are the input files. The last n arguments are the
|
||||
* names of the files in the zip file.
|
||||
*/
|
||||
if (arguments.length % 2 !== 0) {
|
||||
runtime.log("Wrong number of arguments.");
|
||||
usage();
|
||||
runtime.exit(1);
|
||||
}
|
||||
var args = arguments,
|
||||
n = (args.length - 2) / 2,
|
||||
zipfilename = args[1],
|
||||
inputmembers = [],
|
||||
zipmembers = [],
|
||||
i,
|
||||
zip = new core.Zip(zipfilename, null);
|
||||
for (i = 0; i < n; i += 1) {
|
||||
inputmembers[i] = args[2 + i];
|
||||
zipmembers[i] = args[2 + n + i];
|
||||
}
|
||||
addFiles(zip, 0, inputmembers, zipmembers, function (err) {
|
||||
"use strict";
|
||||
if (err) {
|
||||
runtime.log(err);
|
||||
}
|
||||
});
|
||||
@@ -1,30 +0,0 @@
|
||||
macro(COPY_FILES _varname _srcdir _tgtdir)
|
||||
foreach(_file ${ARGN})
|
||||
GET_FILENAME_COMPONENT(_subdir ${_file} PATH)
|
||||
FILE(MAKE_DIRECTORY ${_tgtdir}/${_subdir})
|
||||
add_custom_command(
|
||||
OUTPUT ${_tgtdir}/${_file}
|
||||
COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different
|
||||
${_srcdir}/${_file}
|
||||
${_tgtdir}/${_file}
|
||||
DEPENDS
|
||||
${_srcdir}/${_file}
|
||||
)
|
||||
set(${_varname} ${${_varname}} ${_tgtdir}/${_file})
|
||||
endforeach(_file)
|
||||
endmacro(COPY_FILES _directory _files)
|
||||
|
||||
if(QT4_FOUND)
|
||||
add_subdirectory(qtjsruntime)
|
||||
add_subdirectory(nativeQtClient)
|
||||
add_subdirectory(docnosis)
|
||||
endif(QT4_FOUND)
|
||||
|
||||
if(ANDROID_SDK_DIR AND ANT)
|
||||
add_subdirectory(android)
|
||||
endif(ANDROID_SDK_DIR AND ANT)
|
||||
|
||||
add_subdirectory(firefoxextension)
|
||||
|
||||
add_subdirectory(touchui)
|
||||
add_subdirectory(playbook)
|
||||
@@ -1,42 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.webodf" android:versionCode="1" android:versionName="1.0">
|
||||
<supports-screens android:largeScreens="true"
|
||||
android:normalScreens="true" android:smallScreens="true"
|
||||
android:resizeable="true" android:anyDensity="true" />
|
||||
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="4" />
|
||||
<application android:icon="@drawable/icon"
|
||||
android:label="@string/app_name">
|
||||
<activity android:label="@string/app_name" android:name=".WebODFActivity"
|
||||
android:configChanges="orientation|keyboardHidden">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.text" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.presentation" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.spreadsheet" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name="com.phonegap.DroidGap" android:label="@string/app_name"
|
||||
android:configChanges="orientation|keyboardHidden">
|
||||
<intent-filter>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -1,41 +0,0 @@
|
||||
set(ANDROID_JAR ${ANDROID_SDK_DIR}/platforms/android-8/android.jar)
|
||||
|
||||
COPY_FILES(APKDEPS ${CMAKE_SOURCE_DIR}/programs/touchui
|
||||
${CMAKE_CURRENT_BINARY_DIR}/assets/www ${HTML5UIFILES})
|
||||
COPY_FILES(APKDEPS ${CMAKE_CURRENT_SOURCE_DIR}/assets/www
|
||||
${CMAKE_CURRENT_BINARY_DIR}/assets/www
|
||||
index.html icon.png phonegap-1.4.1.js)
|
||||
COPY_FILES(APKDEPS ${CMAKE_CURRENT_SOURCE_DIR}/res
|
||||
${CMAKE_CURRENT_BINARY_DIR}/res
|
||||
drawable-hdpi/ic_launcher.png drawable-ldpi/ic_launcher.png
|
||||
drawable/icon.png drawable-mdpi/ic_launcher.png values/strings.xml
|
||||
xml/phonegap.xml xml/plugins.xml layout/selector.xml
|
||||
layout/main.xml layout/listitem.xml)
|
||||
COPY_FILES(APKDEPS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}
|
||||
src/org/webodf/WebODFActivity.java libs/phonegap-1.4.1.jar
|
||||
AndroidManifest.xml)
|
||||
COPY_FILES(APKDEPS ${CMAKE_SOURCE_DIR}/webodf
|
||||
${CMAKE_CURRENT_BINARY_DIR}/assets/www webodf.css)
|
||||
COPY_FILES(APKDEPS ${CMAKE_BINARY_DIR}/webodf
|
||||
${CMAKE_CURRENT_BINARY_DIR}/assets/www webodf.js)
|
||||
|
||||
set(WEBODFAPK ${CMAKE_CURRENT_BINARY_DIR}/bin/WebODF-debug.apk)
|
||||
add_custom_command(
|
||||
OUTPUT ${WEBODFAPK}
|
||||
COMMAND ${ANDROID_SDK_DIR}/tools/android
|
||||
ARGS update project --path . --target android-7 --name WebODF
|
||||
COMMAND ${ANT}
|
||||
ARGS -lib ${CMAKE_CURRENT_SOURCE_DIR}/libs/phonegap-1.4.1.jar debug
|
||||
DEPENDS ${APKDEPS}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
add_custom_target(apk ALL DEPENDS ${WEBODFAPK})
|
||||
set(WEBODFRELEASEAPK ${CMAKE_CURRENT_BINARY_DIR}/bin/WebODF-release.apk)
|
||||
add_custom_command(
|
||||
OUTPUT ${WEBODFRELEASEAPK}
|
||||
COMMAND ${ANT}
|
||||
ARGS -lib ${CMAKE_CURRENT_SOURCE_DIR}/libs/phonegap-1.4.1.jar release
|
||||
DEPENDS ${WEBODFAPK} webodf.js
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
add_custom_target(releaseapk ALL DEPENDS ${WEBODFRELEASEAPK})
|
||||
@@ -1,25 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<widget xmlns = "http://www.w3.org/ns/widgets"
|
||||
xmlns:gap = "http://phonegap.com/ns/1.0"
|
||||
id = "org.webodf.phonegap.one"
|
||||
version = "1.0.0">
|
||||
|
||||
<name>WebODF: online/offline office</name>
|
||||
<description>
|
||||
A viewer for ODF files.
|
||||
</description>
|
||||
<author href="http://webodf.org/"
|
||||
email="jos.van.den.oever@kogmbh.com">
|
||||
Jos van den Oever
|
||||
</author>
|
||||
<gap:platforms>
|
||||
<gap:platform name="android" minVersion="2.1" />
|
||||
<gap:platform name="webos" />
|
||||
<gap:platform name="symbian.wrt" />
|
||||
<gap:platform name="blackberry" project="widgets"/>
|
||||
</gap:platforms>
|
||||
<icon src="icon.png" gap:role="default" />
|
||||
<feature name="http://api.phonegap.com/1.0/file"/>
|
||||
<preference name="autorotate" value="false" readonly="true"/>
|
||||
<preference name="orientation" value="default"/>
|
||||
</widget>
|
||||
|
Before Width: | Height: | Size: 3.7 KiB |
@@ -1,46 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>WebODF</title>
|
||||
<link href="sencha-touch.css" rel="stylesheet" type="text/css" />
|
||||
<link href="webodf.css" rel="stylesheet" type="text/css" />
|
||||
<script type="text/javascript" src="phonegap-1.4.1.js"></script>
|
||||
<script type="text/javascript" src="sencha-touch.js"></script>
|
||||
<script type="text/javascript" src="webodf.js"></script>
|
||||
<script type="text/javascript" src="app/app.js"></script>
|
||||
<script type="text/javascript" src="app/controller/Files.js"></script>
|
||||
<script type="text/javascript" src="app/model/FileSystem.js"></script>
|
||||
<script type="text/javascript" src="app/store/FileStore.js"></script>
|
||||
<script type="text/javascript" src="app/views/FileDetail.js"></script>
|
||||
<script type="text/javascript" src="app/views/FilesList.js"></script>
|
||||
<script type="text/javascript" src="app/views/OdfView.js"></script>
|
||||
<script type="text/javascript" src="app/views/Viewport.js"></script>
|
||||
<script type="text/javascript">
|
||||
var applicationReady = false,
|
||||
deviceReady = false,
|
||||
startScanningDirectories;
|
||||
document.addEventListener("deviceready", function () {
|
||||
deviceReady = true;
|
||||
if (applicationReady) {
|
||||
startScanningDirectories();
|
||||
}
|
||||
}, false);
|
||||
/**
|
||||
* Override this function so it waits until the device is ready.
|
||||
*/
|
||||
onApplicationLaunch = function (app) {
|
||||
"use strict";
|
||||
applicationReady = true;
|
||||
startScanningDirectories = function () {
|
||||
if (typeof invokeString !== "undefined" && invokeString) {
|
||||
app.openUrl(invokeString);
|
||||
}
|
||||
app.startScanningDirectories();
|
||||
};
|
||||
if (deviceReady) {
|
||||
startScanningDirectories();
|
||||
}
|
||||
};
|
||||
</script>
|
||||
</head><body></body>
|
||||
</html>
|
||||
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:padding="10dp"
|
||||
android:textSize="16sp" >
|
||||
</TextView>
|
||||
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/hello" />
|
||||
|
||||
</LinearLayout>
|
||||
@@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent" >
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent">
|
||||
|
||||
<TextView android:id="@+id/noteview"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:textSize="10pt" />
|
||||
</ScrollView>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="hello">Hello World, WebODFActivity!</string>
|
||||
<string name="app_name">WebODF</string>
|
||||
|
||||
</resources>
|
||||
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<phonegap>
|
||||
<access origin="http://127.0.0.1*"/>
|
||||
<log level="DEBUG"/>
|
||||
</phonegap>
|
||||
@@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<plugins>
|
||||
<plugin name="App" value="com.phonegap.App"/>
|
||||
<plugin name="Geolocation" value="com.phonegap.GeoBroker"/>
|
||||
<plugin name="Device" value="com.phonegap.Device"/>
|
||||
<plugin name="Accelerometer" value="com.phonegap.AccelListener"/>
|
||||
<plugin name="Compass" value="com.phonegap.CompassListener"/>
|
||||
<plugin name="Media" value="com.phonegap.AudioHandler"/>
|
||||
<plugin name="Camera" value="com.phonegap.CameraLauncher"/>
|
||||
<plugin name="Contacts" value="com.phonegap.ContactManager"/>
|
||||
<plugin name="Crypto" value="com.phonegap.CryptoHandler"/>
|
||||
<plugin name="File" value="com.phonegap.FileUtils"/>
|
||||
<plugin name="Network Status" value="com.phonegap.NetworkManager"/>
|
||||
<plugin name="Notification" value="com.phonegap.Notification"/>
|
||||
<plugin name="Storage" value="com.phonegap.Storage"/>
|
||||
<plugin name="Temperature" value="com.phonegap.TempListener"/>
|
||||
<plugin name="FileTransfer" value="com.phonegap.FileTransfer"/>
|
||||
<plugin name="Capture" value="com.phonegap.Capture"/>
|
||||
</plugins>
|
||||
@@ -1,33 +0,0 @@
|
||||
package org.webodf;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.phonegap.DroidGap;
|
||||
|
||||
public class WebODFActivity extends DroidGap {
|
||||
|
||||
private String path;
|
||||
|
||||
/** Called when the activity is first created. */
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
path = null;
|
||||
if (getIntent() != null && getIntent().getData() != null) {
|
||||
path = getIntent().getData().getPath();
|
||||
}
|
||||
setContentView(R.layout.main);
|
||||
super.loadUrl("file:///android_asset/www/index.html");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
if (path == null) {
|
||||
return;
|
||||
}
|
||||
String escapedPath = "file://" + path.replace("'", "\\'");
|
||||
sendJavascript("invokeString = '" + escapedPath + "';");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
# /bin/bash
|
||||
cd assets
|
||||
for f in `find . -type f`; do cp ../../webodf/$f $f; done
|
||||
@@ -1,111 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
OASIS OpenDocument v1.0
|
||||
OASIS standard, 1 May 2005
|
||||
Relax-NG Manifest Schema
|
||||
|
||||
$Id$
|
||||
|
||||
© 2002-2005 OASIS Open
|
||||
© 1999-2005 Sun Microsystems, Inc.
|
||||
-->
|
||||
|
||||
<grammar
|
||||
xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
|
||||
|
||||
xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
|
||||
<define name="manifest">
|
||||
<element name="manifest:manifest">
|
||||
<oneOrMore>
|
||||
<ref name="file-entry"/>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<start>
|
||||
<choice>
|
||||
<ref name="manifest"/>
|
||||
</choice>
|
||||
</start>
|
||||
<define name="file-entry">
|
||||
<element name="manifest:file-entry">
|
||||
<ref name="file-entry-attlist"/>
|
||||
<optional>
|
||||
<ref name="encryption-data"/>
|
||||
</optional>
|
||||
</element>
|
||||
</define>
|
||||
<define name="file-entry-attlist" combine="interleave">
|
||||
<attribute name="manifest:full-path">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="file-entry-attlist" combine="interleave">
|
||||
<optional>
|
||||
<attribute name="manifest:size">
|
||||
<data type="nonNegativeInteger"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</define>
|
||||
<define name="file-entry-attlist" combine="interleave">
|
||||
<attribute name="manifest:media-type">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="encryption-data">
|
||||
<element name="manifest:encryption-data">
|
||||
<ref name="encryption-data-attlist"/>
|
||||
<ref name="algorithm"/>
|
||||
<ref name="key-derivation"/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="encryption-data-attlist" combine="interleave">
|
||||
<attribute name="manifest:checksum-type">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="encryption-data-attlist" combine="interleave">
|
||||
<attribute name="manifest:checksum">
|
||||
<data type="base64Binary"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="algorithm">
|
||||
<element name="manifest:algorithm">
|
||||
<ref name="algorithm-attlist"/>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="algorithm-attlist" combine="interleave">
|
||||
<attribute name="manifest:algorithm-name">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="algorithm-attlist" combine="interleave">
|
||||
<attribute name="manifest:initialisation-vector">
|
||||
<data type="base64Binary"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="key-derivation">
|
||||
<element name="manifest:key-derivation">
|
||||
<ref name="key-derivation-attlist"/>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="key-derivation-attlist" combine="interleave">
|
||||
<attribute name="manifest:key-derivation-name">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="key-derivation-attlist" combine="interleave">
|
||||
<attribute name="manifest:salt">
|
||||
<data type="base64Binary"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="key-derivation-attlist" combine="interleave">
|
||||
<attribute name="manifest:iteration-count">
|
||||
<data type="nonNegativeInteger"/>
|
||||
</attribute>
|
||||
</define>
|
||||
</grammar>
|
||||
@@ -1,111 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
OASIS OpenDocument v1.1
|
||||
OASIS Standard, 1 Feb 2007
|
||||
Relax-NG Manifest Schema
|
||||
|
||||
$Id$
|
||||
|
||||
© 2002-2007 OASIS Open
|
||||
© 1999-2007 Sun Microsystems, Inc.
|
||||
-->
|
||||
|
||||
<grammar
|
||||
xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
|
||||
|
||||
xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
|
||||
<define name="manifest">
|
||||
<element name="manifest:manifest">
|
||||
<oneOrMore>
|
||||
<ref name="file-entry"/>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<start>
|
||||
<choice>
|
||||
<ref name="manifest"/>
|
||||
</choice>
|
||||
</start>
|
||||
<define name="file-entry">
|
||||
<element name="manifest:file-entry">
|
||||
<ref name="file-entry-attlist"/>
|
||||
<optional>
|
||||
<ref name="encryption-data"/>
|
||||
</optional>
|
||||
</element>
|
||||
</define>
|
||||
<define name="file-entry-attlist" combine="interleave">
|
||||
<attribute name="manifest:full-path">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="file-entry-attlist" combine="interleave">
|
||||
<optional>
|
||||
<attribute name="manifest:size">
|
||||
<data type="nonNegativeInteger"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</define>
|
||||
<define name="file-entry-attlist" combine="interleave">
|
||||
<attribute name="manifest:media-type">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="encryption-data">
|
||||
<element name="manifest:encryption-data">
|
||||
<ref name="encryption-data-attlist"/>
|
||||
<ref name="algorithm"/>
|
||||
<ref name="key-derivation"/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="encryption-data-attlist" combine="interleave">
|
||||
<attribute name="manifest:checksum-type">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="encryption-data-attlist" combine="interleave">
|
||||
<attribute name="manifest:checksum">
|
||||
<data type="base64Binary"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="algorithm">
|
||||
<element name="manifest:algorithm">
|
||||
<ref name="algorithm-attlist"/>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="algorithm-attlist" combine="interleave">
|
||||
<attribute name="manifest:algorithm-name">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="algorithm-attlist" combine="interleave">
|
||||
<attribute name="manifest:initialisation-vector">
|
||||
<data type="base64Binary"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="key-derivation">
|
||||
<element name="manifest:key-derivation">
|
||||
<ref name="key-derivation-attlist"/>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="key-derivation-attlist" combine="interleave">
|
||||
<attribute name="manifest:key-derivation-name">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="key-derivation-attlist" combine="interleave">
|
||||
<attribute name="manifest:salt">
|
||||
<data type="base64Binary"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="key-derivation-attlist" combine="interleave">
|
||||
<attribute name="manifest:iteration-count">
|
||||
<data type="nonNegativeInteger"/>
|
||||
</attribute>
|
||||
</define>
|
||||
</grammar>
|
||||
@@ -1,61 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
OASIS OpenDocument v1.0
|
||||
OASIS Standard, 1 May 2005
|
||||
Strict Relax-NG Schema
|
||||
|
||||
$Id$
|
||||
|
||||
© 2002-2005 OASIS Open
|
||||
© 1999-2005 Sun Microsystems, Inc.
|
||||
-->
|
||||
|
||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
|
||||
<include href="OpenDocument-schema-v1.0-os.rng">
|
||||
<define name="office-meta-content">
|
||||
<ref name="office-meta-content-strict"/>
|
||||
</define>
|
||||
<define name="style-page-layout-properties-content">
|
||||
<ref name="style-page-layout-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-header-footer-properties-content">
|
||||
<ref name="style-header-footer-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-drawing-page-properties-content">
|
||||
<ref name="style-drawing-page-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-text-properties-content">
|
||||
<ref name="style-text-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-paragraph-properties-content">
|
||||
<ref name="style-paragraph-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-ruby-properties-content">
|
||||
<ref name="style-ruby-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-section-properties-content">
|
||||
<ref name="style-section-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-list-level-properties-content">
|
||||
<ref name="style-list-level-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-table-properties-content">
|
||||
<ref name="style-table-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-table-column-properties-content">
|
||||
<ref name="style-table-column-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-table-row-properties-content">
|
||||
<ref name="style-table-row-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-table-cell-properties-content">
|
||||
<ref name="style-table-cell-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-graphic-properties-content">
|
||||
<ref name="style-graphic-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-chart-properties-content">
|
||||
<ref name="style-properties-content"/>
|
||||
</define>
|
||||
</include>
|
||||
</grammar>
|
||||
@@ -1,61 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
OASIS OpenDocument v1.1
|
||||
OASIS Standard, 1 Feb 2007
|
||||
Strict Relax-NG Schema
|
||||
|
||||
$Id$
|
||||
|
||||
© 2002-2007 OASIS Open
|
||||
© 1999-2007 Sun Microsystems, Inc.
|
||||
-->
|
||||
|
||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
|
||||
<include href="OpenDocument-schema-v1.1.rng">
|
||||
<define name="office-meta-content">
|
||||
<ref name="office-meta-content-strict"/>
|
||||
</define>
|
||||
<define name="style-page-layout-properties-content">
|
||||
<ref name="style-page-layout-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-header-footer-properties-content">
|
||||
<ref name="style-header-footer-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-drawing-page-properties-content">
|
||||
<ref name="style-drawing-page-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-text-properties-content">
|
||||
<ref name="style-text-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-paragraph-properties-content">
|
||||
<ref name="style-paragraph-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-ruby-properties-content">
|
||||
<ref name="style-ruby-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-section-properties-content">
|
||||
<ref name="style-section-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-list-level-properties-content">
|
||||
<ref name="style-list-level-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-table-properties-content">
|
||||
<ref name="style-table-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-table-column-properties-content">
|
||||
<ref name="style-table-column-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-table-row-properties-content">
|
||||
<ref name="style-table-row-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-table-cell-properties-content">
|
||||
<ref name="style-table-cell-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-graphic-properties-content">
|
||||
<ref name="style-graphic-properties-content-strict"/>
|
||||
</define>
|
||||
<define name="style-chart-properties-content">
|
||||
<ref name="style-chart-properties-content-strict"/>
|
||||
</define>
|
||||
</include>
|
||||
</grammar>
|
||||
@@ -1,84 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Open Document Format for Office Applications (OpenDocument) Version 1.2
|
||||
Candidate OASIS Standard (COS) 01, 10 May 2011
|
||||
Digital Signatures Relax-NG Schema
|
||||
Source: http://docs.oasis-open.org/office/v1.2/cos01/
|
||||
Copyright (c) OASIS Open 2002-2011. All Rights Reserved.
|
||||
|
||||
All capitalized terms in the following text have the meanings assigned to them
|
||||
in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The
|
||||
full Policy may be found at the OASIS website.
|
||||
|
||||
This document and translations of it may be copied and furnished to others, and
|
||||
derivative works that comment on or otherwise explain it or assist in its
|
||||
implementation may be prepared, copied, published, and distributed, in whole or
|
||||
in part, without restriction of any kind, provided that the above copyright
|
||||
notice and this section are included on all such copies and derivative works.
|
||||
However, this document itself may not be modified in any way, including by
|
||||
removing the copyright notice or references to OASIS, except as needed for the
|
||||
purpose of developing any document or deliverable produced by an OASIS
|
||||
Technical Committee (in which case the rules applicable to copyrights, as set
|
||||
forth in the OASIS IPR Policy, must be followed) or as required to translate it
|
||||
into languages other than English.
|
||||
|
||||
The limited permissions granted above are perpetual and will not be revoked by
|
||||
OASIS or its successors or assigns.
|
||||
|
||||
This document and the information contained herein is provided on an "AS IS"
|
||||
basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT
|
||||
INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
|
||||
FITNESS FOR A PARTICULAR PURPOSE.
|
||||
-->
|
||||
|
||||
<grammar
|
||||
xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
|
||||
|
||||
xmlns:dsig="urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0"
|
||||
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
|
||||
>
|
||||
<start>
|
||||
<choice>
|
||||
<ref name="dsig-document-signatures"/>
|
||||
</choice>
|
||||
</start>
|
||||
<define name="dsig-document-signatures">
|
||||
<element name="dsig:document-signatures">
|
||||
<ref name="dsig-document-signatures-attlist"/>
|
||||
<oneOrMore>
|
||||
<ref name="ds-signature"/>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
<define name="dsig-document-signatures-attlist">
|
||||
<attribute name="dsig:version">
|
||||
<value>1.2</value>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="ds-signature">
|
||||
<element name="ds:Signature">
|
||||
<!-- The permitted content of this element is the permitted -->
|
||||
<!-- content of the Signature element defined by W3C XML -->
|
||||
<!-- Signature Syntax and Processing (Second Edition). -->
|
||||
<!-- See OpenDocument v1.2 part 3, section 4.3. -->
|
||||
<ref name="dsMarkup"/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="dsMarkup">
|
||||
<zeroOrMore>
|
||||
<choice>
|
||||
<attribute>
|
||||
<anyName/>
|
||||
</attribute>
|
||||
<text/>
|
||||
<element>
|
||||
<anyName/>
|
||||
<ref name="dsMarkup"/>
|
||||
</element>
|
||||
</choice>
|
||||
</zeroOrMore>
|
||||
</define>
|
||||
</grammar>
|
||||
@@ -1,224 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Open Document Format for Office Applications (OpenDocument) Version 1.2
|
||||
Candidate OASIS Standard (COS) 01, 10 May 2011
|
||||
Manifest Relax-NG Schema
|
||||
Source: http://docs.oasis-open.org/office/v1.2/cos01/
|
||||
Copyright (c) OASIS Open 2002-2011. All Rights Reserved.
|
||||
|
||||
All capitalized terms in the following text have the meanings assigned to them
|
||||
in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The
|
||||
full Policy may be found at the OASIS website.
|
||||
|
||||
This document and translations of it may be copied and furnished to others, and
|
||||
derivative works that comment on or otherwise explain it or assist in its
|
||||
implementation may be prepared, copied, published, and distributed, in whole or
|
||||
in part, without restriction of any kind, provided that the above copyright
|
||||
notice and this section are included on all such copies and derivative works.
|
||||
However, this document itself may not be modified in any way, including by
|
||||
removing the copyright notice or references to OASIS, except as needed for the
|
||||
purpose of developing any document or deliverable produced by an OASIS
|
||||
Technical Committee (in which case the rules applicable to copyrights, as set
|
||||
forth in the OASIS IPR Policy, must be followed) or as required to translate it
|
||||
into languages other than English.
|
||||
|
||||
The limited permissions granted above are perpetual and will not be revoked by
|
||||
OASIS or its successors or assigns.
|
||||
|
||||
This document and the information contained herein is provided on an "AS IS"
|
||||
basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT
|
||||
INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
|
||||
FITNESS FOR A PARTICULAR PURPOSE.
|
||||
-->
|
||||
<grammar
|
||||
xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
|
||||
|
||||
xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"
|
||||
>
|
||||
<start>
|
||||
<choice>
|
||||
<ref name="manifest"/>
|
||||
</choice>
|
||||
</start>
|
||||
<define name="manifest">
|
||||
<element name="manifest:manifest">
|
||||
<ref name="manifest-attlist"/>
|
||||
<oneOrMore>
|
||||
<ref name="file-entry"/>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
<define name="manifest-attlist">
|
||||
<attribute name="manifest:version">
|
||||
<value>1.2</value>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="file-entry">
|
||||
<element name="manifest:file-entry">
|
||||
<ref name="file-entry-attlist"/>
|
||||
<optional>
|
||||
<ref name="encryption-data"/>
|
||||
</optional>
|
||||
</element>
|
||||
</define>
|
||||
<define name="file-entry-attlist">
|
||||
<interleave>
|
||||
<attribute name="manifest:full-path">
|
||||
<ref name="string"/>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="manifest:size">
|
||||
<ref name="nonNegativeInteger"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<attribute name="manifest:media-type">
|
||||
<ref name="string"/>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="manifest:preferred-view-mode">
|
||||
<choice>
|
||||
<value>edit</value>
|
||||
<value>presentation-slide-show</value>
|
||||
<value>read-only</value>
|
||||
<ref name="namespacedToken"/>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="manifest:version">
|
||||
<ref name="string"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</interleave>
|
||||
</define>
|
||||
|
||||
<define name="encryption-data">
|
||||
<element name="manifest:encryption-data">
|
||||
<ref name="encryption-data-attlist"/>
|
||||
<ref name="algorithm"/>
|
||||
<optional>
|
||||
<ref name="start-key-generation"/>
|
||||
</optional>
|
||||
<ref name="key-derivation"/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="encryption-data-attlist">
|
||||
<interleave>
|
||||
<attribute name="manifest:checksum-type">
|
||||
<choice>
|
||||
<value>SHA1/1K</value>
|
||||
<ref name="anyURI"/>
|
||||
</choice>
|
||||
</attribute>
|
||||
<attribute name="manifest:checksum">
|
||||
<ref name="base64Binary"/>
|
||||
</attribute>
|
||||
</interleave>
|
||||
</define>
|
||||
<define name="algorithm">
|
||||
<element name="manifest:algorithm">
|
||||
<ref name="algorithm-attlist"/>
|
||||
<ref name="anyElements"/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="algorithm-attlist">
|
||||
<interleave>
|
||||
<attribute name="manifest:algorithm-name">
|
||||
<choice>
|
||||
<value>Blowfish CFB</value>
|
||||
<ref name="anyURI"/>
|
||||
</choice>
|
||||
</attribute>
|
||||
<attribute name="manifest:initialisation-vector">
|
||||
<ref name="base64Binary"/>
|
||||
</attribute>
|
||||
</interleave>
|
||||
</define>
|
||||
<define name="anyAttListOrElements">
|
||||
<zeroOrMore>
|
||||
<attribute>
|
||||
<anyName/>
|
||||
<text/>
|
||||
</attribute>
|
||||
</zeroOrMore>
|
||||
<ref name="anyElements"/>
|
||||
</define>
|
||||
<define name="anyElements">
|
||||
<zeroOrMore>
|
||||
<element>
|
||||
<anyName/>
|
||||
<mixed>
|
||||
<ref name="anyAttListOrElements"/>
|
||||
</mixed>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
</define>
|
||||
<define name="key-derivation">
|
||||
<element name="manifest:key-derivation">
|
||||
<ref name="key-derivation-attlist"/>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="key-derivation-attlist">
|
||||
<interleave>
|
||||
<attribute name="manifest:key-derivation-name">
|
||||
<choice>
|
||||
<value>PBKDF2</value>
|
||||
<ref name="anyURI"/>
|
||||
</choice>
|
||||
</attribute>
|
||||
<attribute name="manifest:salt">
|
||||
<ref name="base64Binary"/>
|
||||
</attribute>
|
||||
<attribute name="manifest:iteration-count">
|
||||
<ref name="nonNegativeInteger"/>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="manifest:key-size">
|
||||
<ref name="nonNegativeInteger"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</interleave>
|
||||
</define>
|
||||
<define name="start-key-generation">
|
||||
<element name="manifest:start-key-generation">
|
||||
<ref name="start-key-generation-attlist"/>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
<define name="start-key-generation-attlist">
|
||||
<interleave>
|
||||
<attribute name="manifest:start-key-generation-name">
|
||||
<choice>
|
||||
<value>SHA1</value>
|
||||
<ref name="anyURI"/>
|
||||
</choice>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="manifest:key-size">
|
||||
<ref name="nonNegativeInteger"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</interleave>
|
||||
</define>
|
||||
<define name="base64Binary">
|
||||
<data type="base64Binary"/>
|
||||
</define>
|
||||
<define name="namespacedToken">
|
||||
<data type="QName">
|
||||
<param name="pattern">[^:]+:[^:]+</param>
|
||||
</data>
|
||||
</define>
|
||||
<define name="nonNegativeInteger">
|
||||
<data type="nonNegativeInteger"/>
|
||||
</define>
|
||||
<define name="string">
|
||||
<data type="string"/>
|
||||
</define>
|
||||
<define name="anyURI">
|
||||
<data type="anyURI"/>
|
||||
</define>
|
||||
</grammar>
|
||||
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 6.6 KiB |
@@ -1,779 +0,0 @@
|
||||
/*global runtime, Node, window, DOMParser, core, xmldom, NodeFilter, alert,
|
||||
FileReader*/
|
||||
runtime.loadClass("core.Zip");
|
||||
runtime.loadClass("core.Base64");
|
||||
runtime.loadClass("xmldom.RelaxNG");
|
||||
|
||||
/** This code runs a number of tests on an ODF document.
|
||||
* Ideally, it would use ODFContainer, but for now, it uses a custome container
|
||||
* for loaded odf files.
|
||||
*/
|
||||
|
||||
function conformsToPattern(object, pattern, name) {
|
||||
"use strict";
|
||||
var i;
|
||||
if (object === undefined || object === null) {
|
||||
return pattern === null || (typeof pattern) !== "object";
|
||||
}
|
||||
for (i in pattern) {
|
||||
if (pattern.hasOwnProperty(i)) {
|
||||
if (!(object.hasOwnProperty(i) ||
|
||||
(i === "length" && object.length)) ||
|
||||
!conformsToPattern(object[i], pattern[i], i)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function getConformingObjects(object, pattern, name) {
|
||||
"use strict";
|
||||
var c = [], i, j;
|
||||
name = name || "??";
|
||||
// we do not look inside long arrays and strings atm,
|
||||
// detection of these types could be better
|
||||
function accept(object) {
|
||||
return object !== null && object !== undefined &&
|
||||
(typeof object) === "object" &&
|
||||
(object.length === undefined || object.length < 1000) &&
|
||||
!(object instanceof Node) &&
|
||||
!(object.constructor && object.constructor === window.Uint8Array);
|
||||
}
|
||||
for (i in object) {
|
||||
if (object.hasOwnProperty(i) && accept(object[i])) {
|
||||
c = c.concat(getConformingObjects(object[i], pattern, i));
|
||||
}
|
||||
}
|
||||
if (conformsToPattern(object, pattern, "?")) {
|
||||
c.push(object);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
function parseXml(data, errorlog, name) {
|
||||
"use strict";
|
||||
function getText(e) {
|
||||
var str = "", c = e.firstChild;
|
||||
while (c) {
|
||||
if (c.nodeType === 3) {
|
||||
str += c.nodeValue;
|
||||
} else {
|
||||
str += getText(c);
|
||||
}
|
||||
c = c.nextSibling;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
var str, parser, errorelements;
|
||||
try {
|
||||
str = runtime.byteArrayToString(data, "utf8");
|
||||
parser = new DOMParser();
|
||||
str = parser.parseFromString(str, "text/xml");
|
||||
if (str.documentElement.localName === "parsererror"
|
||||
|| str.documentElement.localName === "html") {
|
||||
errorelements = str.getElementsByTagName("parsererror");
|
||||
if (errorelements.length > 0) {
|
||||
errorlog.push("invalid XML in " + name + ": " +
|
||||
getText(errorelements[0]));
|
||||
str = null;
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
errorlog.push(err);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/*** the jobs / tests ***/
|
||||
|
||||
function ParseXMLJob() {
|
||||
"use strict";
|
||||
this.inputpattern = { file: { entries: [] } };
|
||||
this.outputpattern = {
|
||||
file: { entries: [] },
|
||||
errors: { parseXmlErrors: [] },
|
||||
content_xml: null,
|
||||
manifest_xml: null,
|
||||
settings_xml: null,
|
||||
meta_xml: null,
|
||||
styles_xml: null
|
||||
};
|
||||
function parseXmlFiles(input, position, callback) {
|
||||
var e = input.file.entries,
|
||||
filename,
|
||||
ext,
|
||||
dom;
|
||||
if (position >= e.length) {
|
||||
return callback();
|
||||
}
|
||||
filename = e[position].filename;
|
||||
ext = filename.substring(filename.length - 4);
|
||||
if (ext === ".xml" || ext === ".rdf") {
|
||||
dom = parseXml(e[position].data, input.errors.parseXmlErrors,
|
||||
filename);
|
||||
if (filename === "content.xml") {
|
||||
input.content_xml = dom;
|
||||
} else if (filename === "META-INF/manifest.xml") {
|
||||
input.manifest_xml = dom;
|
||||
} else if (filename === "styles.xml") {
|
||||
input.styles_xml = dom;
|
||||
} else if (filename === "meta.xml") {
|
||||
input.meta_xml = dom;
|
||||
} else if (filename === "settings.xml") {
|
||||
input.settings_xml = dom;
|
||||
}
|
||||
e[position].dom = dom;
|
||||
}
|
||||
window.setTimeout(function () {
|
||||
parseXmlFiles(input, position + 1, callback);
|
||||
}, 0);
|
||||
}
|
||||
this.run = function (input, callback) {
|
||||
input.errors = input.errors || {};
|
||||
input.errors.parseXmlErrors = [];
|
||||
input.content_xml = null;
|
||||
input.manifest_xml = null;
|
||||
input.styles_xml = null;
|
||||
input.meta_xml = null;
|
||||
input.settings_xml = null;
|
||||
parseXmlFiles(input, 0, callback);
|
||||
};
|
||||
}
|
||||
function UnpackJob() {
|
||||
"use strict";
|
||||
this.inputpattern = { file: { path: "", data: { length: 0 } } };
|
||||
this.outputpattern = {
|
||||
file: { entries: [], dom: null }, errors: { unpackErrors: [] }
|
||||
};
|
||||
function getText(e) {
|
||||
var str = "", c = e.firstChild;
|
||||
while (c) {
|
||||
if (c.nodeType === 3) {
|
||||
str += c.nodeValue;
|
||||
} else {
|
||||
str += getText(c);
|
||||
}
|
||||
c = c.nextSibling;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
function loadZipEntries(input, position, callback) {
|
||||
if (position >= input.file.entries.length) {
|
||||
return callback();
|
||||
}
|
||||
var e = input.file.entries[position];
|
||||
e.load(function (err, data) {
|
||||
if (err) {
|
||||
input.errors.unpackErrors.push(err);
|
||||
}
|
||||
e.error = err;
|
||||
e.data = data;
|
||||
window.setTimeout(function () {
|
||||
loadZipEntries(input, position + 1, callback);
|
||||
}, 0);
|
||||
});
|
||||
}
|
||||
function loadZip(input, callback) {
|
||||
var zip = new core.Zip(input.file.path, function (err, zip) {
|
||||
var i;
|
||||
if (err) {
|
||||
input.errors.unpackErrors.push(err);
|
||||
callback();
|
||||
} else {
|
||||
input.file.entries = zip.getEntries();
|
||||
loadZipEntries(input, 0, callback);
|
||||
}
|
||||
});
|
||||
}
|
||||
function loadXml(input, callback) {
|
||||
input.file.dom = parseXml(input.file.data, input.errors.unpackErrors,
|
||||
input.file.name);
|
||||
callback();
|
||||
}
|
||||
this.run = function (input, callback) {
|
||||
input.errors = input.errors || {};
|
||||
input.errors.unpackErrors = [];
|
||||
input.file.dom = null;
|
||||
input.file.entries = [];
|
||||
|
||||
if (input.file.data.length < 1) {
|
||||
input.errors.unpackErrors.push("Input data is empty.");
|
||||
return;
|
||||
}
|
||||
if (input.file.data[0] === 80) { // a ZIP file starts with 'P'
|
||||
loadZip(input, callback);
|
||||
} else {
|
||||
loadXml(input, callback);
|
||||
}
|
||||
};
|
||||
}
|
||||
function MimetypeTestJob(odffile) {
|
||||
"use strict";
|
||||
this.inputpattern = {
|
||||
file: { entries: [], dom: null },
|
||||
manifest_xml: null
|
||||
};
|
||||
this.outputpattern = { mimetype: "", errors: { mimetypeErrors: [] } };
|
||||
var manifestns = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0";
|
||||
function getManifestMimetype(manifest) {
|
||||
if (!manifest) {
|
||||
return null;
|
||||
}
|
||||
var path, mimetype, node;
|
||||
node = manifest.documentElement.firstChild;
|
||||
while (node) {
|
||||
if (node.nodeType === 1 && node.localName === "file-entry" &&
|
||||
node.namespaceURI === manifestns) {
|
||||
path = node.getAttributeNS(manifestns, "full-path");
|
||||
if (path === "/") {
|
||||
mimetype = node.getAttributeNS(manifestns, "media-type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
node = node.nextSibling;
|
||||
}
|
||||
return mimetype;
|
||||
}
|
||||
this.run = function (input, callback) {
|
||||
input.mimetype = null;
|
||||
input.errors.mimetypeErrors = [];
|
||||
var mime = null,
|
||||
altmime,
|
||||
e = input.file.entries,
|
||||
i;
|
||||
if (input.file.dom) {
|
||||
mime = input.file.dom.documentElement.getAttributeNS(
|
||||
"urn:oasis:names:tc:opendocument:xmlns:office:1.0", "mimetype");
|
||||
} else {
|
||||
if (e.length < 1 || e[0].filename !== "mimetype") {
|
||||
input.errors.mimetypeErrors.push(
|
||||
"First file in zip is not 'mimetype'");
|
||||
}
|
||||
for (i = 0; i < e.length; i += 1) {
|
||||
if (e[i].filename === "mimetype") {
|
||||
mime = runtime.byteArrayToString(e[i].data, "binary");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (mime) {
|
||||
altmime = input.file.data.slice(38, 38 + mime.length);
|
||||
altmime = runtime.byteArrayToString(altmime, "binary");
|
||||
if (mime !== altmime) {
|
||||
input.errors.mimetypeErrors.push(
|
||||
"mimetype should start at byte 38 in the zip file.");
|
||||
}
|
||||
}
|
||||
// compare with mimetype from manifest_xml
|
||||
altmime = getManifestMimetype(input.manifest_xml);
|
||||
if (altmime !== mime) {
|
||||
input.errors.mimetypeErrors.push(
|
||||
"manifest.xml has a different mimetype.");
|
||||
}
|
||||
}
|
||||
if (!mime) {
|
||||
input.errors.mimetypeErrors.push("No mimetype was found.");
|
||||
}
|
||||
input.mimetype = mime;
|
||||
callback();
|
||||
};
|
||||
}
|
||||
function VersionTestJob() {
|
||||
"use strict";
|
||||
this.inputpattern = {
|
||||
file: { dom: null },
|
||||
content_xml: null,
|
||||
styles_xml: null,
|
||||
meta_xml: null,
|
||||
settings_xml: null,
|
||||
manifest_xml: null
|
||||
};
|
||||
this.outputpattern = { version: "", errors: { versionErrors: [] } };
|
||||
var officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0";
|
||||
function getVersion(dom, filename, log, vinfo, filerequired) {
|
||||
var v, ns = officens;
|
||||
if (!dom) {
|
||||
if (filerequired) {
|
||||
log.push(filename + " is missing, so version cannot be found.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (filename === "META-INF/manifest.xml") {
|
||||
ns = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0";
|
||||
}
|
||||
if (!dom.documentElement.hasAttributeNS(ns, "version")) {
|
||||
if (vinfo.versionrequired) {
|
||||
log.push(filename + " has no version number.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
v = dom.documentElement.getAttributeNS(ns, "version");
|
||||
if (vinfo.version === undefined) {
|
||||
vinfo.version = v;
|
||||
// version number is required since ODF 1.2
|
||||
vinfo.needversion = vinfo.version === "1.2";
|
||||
vinfo.versionSource = filename;
|
||||
} else if (v !== vinfo.version) {
|
||||
log.push(vinfo.versionSource + " and " + filename + " " +
|
||||
" have different version number.");
|
||||
}
|
||||
}
|
||||
this.run = function (input, callback) {
|
||||
input.errors.versionErrors = [];
|
||||
var v,
|
||||
e = input.file.entries,
|
||||
log = input.errors.versionErrors,
|
||||
vinfo = {
|
||||
version: undefined,
|
||||
needversion: null,
|
||||
versionSource: null
|
||||
},
|
||||
contentxmlhasnoversionnumber;
|
||||
if (input.file.dom) {
|
||||
getVersion(input.file.dom, input.file.name, log, vinfo, true);
|
||||
} else {
|
||||
// until we know the version number, we cannot claim that
|
||||
// content.xml needs a version number
|
||||
getVersion(input.content_xml, "content.xml", log, vinfo, true);
|
||||
contentxmlhasnoversionnumber = vinfo.version === undefined;
|
||||
getVersion(input.manifest_xml, "META-INF/manifest.xml", log,
|
||||
vinfo, true);
|
||||
getVersion(input.styles_xml, "styles.xml", log, vinfo);
|
||||
getVersion(input.meta_xml, "meta.xml", log, vinfo);
|
||||
getVersion(input.settings_xml, "settings.xml", log, vinfo);
|
||||
if (vinfo.needversion && contentxmlhasnoversionnumber) {
|
||||
log.push("content.xml has no version number.");
|
||||
}
|
||||
}
|
||||
input.version = vinfo.version;
|
||||
callback();
|
||||
};
|
||||
}
|
||||
function GetThumbnailJob() {
|
||||
"use strict";
|
||||
var base64 = new core.Base64();
|
||||
this.inputpattern = { file: { entries: [] }, errors: {}, mimetype: "" };
|
||||
this.outputpattern = { thumbnail: "", errors: { thumbnailErrors: [] } };
|
||||
this.run = function (input, callback) {
|
||||
input.thumbnail = null;
|
||||
input.errors.thumbnailErrors = [];
|
||||
var i, e = input.file.entries, mime = input.mimetype, thumb = null;
|
||||
if (mime === "application/vnd.oasis.opendocument.text") {
|
||||
thumb = "application-vnd.oasis.opendocument.text.png";
|
||||
} else if (mime === "application/vnd.oasis.opendocument.spreadsheet") {
|
||||
thumb = "application-vnd.oasis.opendocument.spreadsheet.png";
|
||||
} else if (mime === "application/vnd.oasis.opendocument.presentation") {
|
||||
thumb = "application-vnd.oasis.opendocument.presentation.png";
|
||||
}
|
||||
for (i = 0; i < e.length; i += 1) {
|
||||
if (e[i].filename === "Thumbnails/thumbnail.png") {
|
||||
thumb = "data:image/png;base64," +
|
||||
base64.convertUTF8ArrayToBase64(e[i].data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
input.thumbnail = thumb;
|
||||
callback();
|
||||
};
|
||||
}
|
||||
function RelaxNGJob() {
|
||||
"use strict";
|
||||
var parser = new xmldom.RelaxNGParser(),
|
||||
validators = {};
|
||||
this.inputpattern = { file: {dom: null}, version: null };
|
||||
this.outputpattern = { errors: { relaxngErrors: [] } };
|
||||
function loadValidator(ns, version, callback) {
|
||||
var rng;
|
||||
if (ns === "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0") {
|
||||
if (version === "1.2") {
|
||||
rng = "OpenDocument-v1.2-cos01-manifest-schema.rng";
|
||||
} else if (version === "1.1") {
|
||||
rng = "OpenDocument-manifest-schema-v1.1.rng";
|
||||
} else if (version === "1.0") {
|
||||
rng = "OpenDocument-manifest-schema-v1.0-os.rng";
|
||||
}
|
||||
} else if (ns === "urn:oasis:names:tc:opendocument:xmlns:office:1.0") {
|
||||
if (version === "1.2") {
|
||||
rng = "OpenDocument-v1.2-cos01-schema.rng";
|
||||
} else if (version === "1.1") {
|
||||
rng = "OpenDocument-schema-v1.1.rng";
|
||||
} else if (version === "1.0") {
|
||||
rng = "OpenDocument-schema-v1.0-os.rng";
|
||||
}
|
||||
}
|
||||
if (rng) {
|
||||
runtime.loadXML(rng, function (err, dom) {
|
||||
var relaxng;
|
||||
if (err) {
|
||||
runtime.log(err);
|
||||
} else {
|
||||
relaxng = new xmldom.RelaxNG();
|
||||
err = parser.parseRelaxNGDOM(dom, relaxng.makePattern);
|
||||
if (err) {
|
||||
runtime.log(err);
|
||||
} else {
|
||||
relaxng.init(parser.rootPattern);
|
||||
}
|
||||
}
|
||||
validators[ns] = validators[ns] || {};
|
||||
validators[ns][version] = relaxng;
|
||||
callback(relaxng);
|
||||
});
|
||||
} else {
|
||||
callback(null);
|
||||
}
|
||||
}
|
||||
function getValidator(ns, version, callback) {
|
||||
if (ns === "urn:oasis:names:tc:opendocument:xmlns:office:1.0" ||
|
||||
ns === "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0") {
|
||||
if (!version) {
|
||||
version = "1.1";
|
||||
}
|
||||
}
|
||||
if (validators[ns] && validators[ns][version]) {
|
||||
return callback(validators[ns][version]);
|
||||
}
|
||||
loadValidator(ns, version, callback);
|
||||
}
|
||||
function validate(log, dom, filename, version, callback) {
|
||||
var ns = dom.documentElement.namespaceURI;
|
||||
getValidator(ns, version, function (relaxng) {
|
||||
if (!relaxng) {
|
||||
return callback();
|
||||
}
|
||||
var walker = dom.createTreeWalker(dom.firstChild, 0xFFFFFFFF,
|
||||
{ acceptNode: function(node) {
|
||||
return NodeFilter.FILTER_ACCEPT; }
|
||||
}, false),
|
||||
err;
|
||||
runtime.log("START VALIDATING");
|
||||
err = relaxng.validate(walker, function (err) {
|
||||
runtime.log("FINISHED VALIDATING");
|
||||
var i;
|
||||
if (err) {
|
||||
for (i = 0; i < err.length; i += 1) {
|
||||
log.push(filename + ": " + err[i]);
|
||||
}
|
||||
}
|
||||
callback();
|
||||
});
|
||||
});
|
||||
}
|
||||
function validateEntries(log, entries, position, version, callback) {
|
||||
if (position >= entries.length) {
|
||||
return callback();
|
||||
}
|
||||
var e = entries[position];
|
||||
if (e.dom) {
|
||||
validate(log, e.dom, e.filename, version, function () {
|
||||
window.setTimeout(function () {
|
||||
validateEntries(log, entries, position + 1, version,
|
||||
callback);
|
||||
}, 0);
|
||||
});
|
||||
} else {
|
||||
validateEntries(log, entries, position + 1, version, callback);
|
||||
}
|
||||
}
|
||||
this.run = function (input, callback) {
|
||||
input.errors = input.errors || {};
|
||||
input.errors.relaxngErrors = [];
|
||||
runtime.log(input.version);
|
||||
if (input.file.dom) {
|
||||
validate(input.errors.relaxngErrors, input.file.dom,
|
||||
input.file.path, input.version, callback);
|
||||
return;
|
||||
}
|
||||
var i, e = input.file.entries;
|
||||
validateEntries(input.errors.relaxngErrors, input.file.entries, 0,
|
||||
input.version, callback);
|
||||
};
|
||||
}
|
||||
|
||||
function DataRenderer(parentelement) {
|
||||
"use strict";
|
||||
var doc = parentelement.ownerDocument,
|
||||
element = doc.createElement("div"),
|
||||
lastrendertime,
|
||||
delayedRenderComing,
|
||||
renderinterval = 300; // minimal milliseconds between renders
|
||||
function clear(element) {
|
||||
while (element.firstChild) {
|
||||
element.removeChild(element.firstChild);
|
||||
}
|
||||
}
|
||||
function addParagraph(div, text) {
|
||||
var p = doc.createElement("p");
|
||||
p.appendChild(doc.createTextNode(text));
|
||||
div.appendChild(p);
|
||||
}
|
||||
function addSpan(parent, nodename, text) {
|
||||
var e = doc.createElement(nodename);
|
||||
e.appendChild(doc.createTextNode(text));
|
||||
parent.appendChild(e);
|
||||
}
|
||||
function addErrors(div, e, active) {
|
||||
var i, o;
|
||||
for (i in e) {
|
||||
if (e.hasOwnProperty(i)) {
|
||||
o = e[i];
|
||||
if (active && ((typeof o) === "string"
|
||||
|| o instanceof String)) {
|
||||
addParagraph(div, o);
|
||||
} else if (o && (typeof o) === "object" &&
|
||||
!(o instanceof Node) &&
|
||||
!(o.constructor &&
|
||||
o.constructor === window.Uint8Array)) {
|
||||
addErrors(div, o, active || i === "errors");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function renderFile(data) {
|
||||
var div = doc.createElement("div"),
|
||||
h1 = doc.createElement("h1"),
|
||||
icon = doc.createElement("img");
|
||||
div.style.clear = "both";
|
||||
div.appendChild(h1);
|
||||
div.appendChild(icon);
|
||||
h1.appendChild(doc.createTextNode(data.file.path));
|
||||
element.appendChild(div);
|
||||
if (data.thumbnail) {
|
||||
icon.src = data.thumbnail;
|
||||
}
|
||||
icon.style.width = "128px";
|
||||
icon.style.float = "left";
|
||||
icon.style.mozBoxShadow = icon.style.webkitBoxShadow =
|
||||
icon.style.boxShadow = "3px 3px 4px #000";
|
||||
icon.style.marginRight = icon.style.marginBottom = "10px";
|
||||
addParagraph(div, "mimetype: " + data.mimetype);
|
||||
addParagraph(div, "version: " + data.version);
|
||||
addParagraph(div, "document representation: " +
|
||||
((data.file.dom) ? "single XML document" :"package"));
|
||||
addErrors(div, data, false);
|
||||
}
|
||||
function dorender(data) {
|
||||
clear(element);
|
||||
var i;
|
||||
for (i = 0; i < data.length; i += 1) {
|
||||
renderFile(data[i]);
|
||||
}
|
||||
}
|
||||
this.render = function render(data) {
|
||||
var now = Date.now();
|
||||
if (!lastrendertime || now - lastrendertime > renderinterval) {
|
||||
lastrendertime = now;
|
||||
dorender(data);
|
||||
} else if (!delayedRenderComing) {
|
||||
delayedRenderComing = true;
|
||||
window.setTimeout(function () {
|
||||
delayedRenderComing = false;
|
||||
lastrendertime = now + renderinterval;
|
||||
dorender(data);
|
||||
}, renderinterval);
|
||||
}
|
||||
};
|
||||
parentelement.appendChild(element);
|
||||
}
|
||||
|
||||
function JobRunner(datarenderer) {
|
||||
"use strict";
|
||||
var jobrunner = this,
|
||||
jobtypes = [],
|
||||
data,
|
||||
busy = false,
|
||||
todo = [];
|
||||
|
||||
jobtypes.push(new UnpackJob());
|
||||
jobtypes.push(new MimetypeTestJob());
|
||||
jobtypes.push(new GetThumbnailJob());
|
||||
jobtypes.push(new VersionTestJob());
|
||||
jobtypes.push(new ParseXMLJob());
|
||||
jobtypes.push(new RelaxNGJob());
|
||||
|
||||
function run() {
|
||||
if (busy) {
|
||||
return;
|
||||
}
|
||||
var job = todo.shift();
|
||||
if (job) {
|
||||
busy = true;
|
||||
job.job.run(job.object, function () {
|
||||
busy = false;
|
||||
if (!conformsToPattern(job.object, job.job.outputpattern)) {
|
||||
throw "Job does not give correct output.";
|
||||
}
|
||||
datarenderer.render(data);
|
||||
window.setTimeout(run, 0);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function update(ignore, callback) {
|
||||
var i, jobtype, j, inobjects, outobjects;
|
||||
todo = [];
|
||||
for (i = 0; i < jobtypes.length; i += 1) {
|
||||
jobtype = jobtypes[i];
|
||||
inobjects = getConformingObjects(data, jobtype.inputpattern);
|
||||
outobjects = getConformingObjects(data, jobtype.outputpattern);
|
||||
for (j = 0; j < inobjects.length; j += 1) {
|
||||
if (outobjects.indexOf(inobjects[j]) === -1) {
|
||||
todo.push({job: jobtype, object: inobjects[j]});
|
||||
}
|
||||
}
|
||||
}
|
||||
if (todo.length > 0) {
|
||||
// run update again after all todos are done
|
||||
todo.push({job: jobrunner, object: null});
|
||||
}
|
||||
if (callback) {
|
||||
callback();
|
||||
} else {
|
||||
run();
|
||||
}
|
||||
}
|
||||
|
||||
this.run = update;
|
||||
|
||||
this.setData = function setData(newdata) {
|
||||
data = newdata;
|
||||
if (busy) {
|
||||
todo = [];
|
||||
todo.push({job: jobrunner, object: null});
|
||||
} else {
|
||||
update();
|
||||
}
|
||||
};
|
||||
}
|
||||
function LoadingFile(file) {
|
||||
"use strict";
|
||||
var data,
|
||||
error,
|
||||
readRequests = [];
|
||||
function load(callback) {
|
||||
var reader = new FileReader();
|
||||
reader.onloadend = function(evt) {
|
||||
data = runtime.byteArrayFromString(evt.target.result, "binary");
|
||||
error = evt.target.error && String(evt.target.error);
|
||||
var i = 0;
|
||||
for (i = 0; i < readRequests.length; i += 1) {
|
||||
readRequests[i]();
|
||||
}
|
||||
readRequests = undefined;
|
||||
reader = undefined;
|
||||
callback(error, data);
|
||||
};
|
||||
reader.readAsBinaryString(file);
|
||||
}
|
||||
this.file = file;
|
||||
this.read = function (offset, length, callback) {
|
||||
function read() {
|
||||
if (error) {
|
||||
return callback(error);
|
||||
}
|
||||
if (data) {
|
||||
return callback(error, data.slice(offset, offset + length));
|
||||
}
|
||||
readRequests.push(read);
|
||||
}
|
||||
read();
|
||||
};
|
||||
this.load = load;
|
||||
}
|
||||
function Docnosis(element) {
|
||||
"use strict";
|
||||
var doc = element.ownerDocument,
|
||||
form,
|
||||
diagnoses = doc.createElement("div"),
|
||||
openedFiles = {},
|
||||
datarenderer = new DataRenderer(diagnoses),
|
||||
jobrunner = new JobRunner(datarenderer),
|
||||
jobrunnerdata = [];
|
||||
|
||||
function dragHandler(evt) {
|
||||
var over = evt.type === "dragover" && evt.target.nodeName !== "INPUT";
|
||||
if (over || evt.type === "drop") {
|
||||
evt.stopPropagation();
|
||||
evt.preventDefault();
|
||||
}
|
||||
if (evt.target.style) {
|
||||
evt.target.style.background = (over ? "#CCCCCC" : "inherit");
|
||||
}
|
||||
}
|
||||
|
||||
function fileSelectHandler(evt) {
|
||||
// cancel event and hover styling
|
||||
dragHandler(evt);
|
||||
|
||||
function diagnoseFile(file) {
|
||||
var loadingfile, path;
|
||||
path = file.name;
|
||||
loadingfile = new LoadingFile(file);
|
||||
openedFiles[path] = loadingfile;
|
||||
loadingfile.load(function (error, data) {
|
||||
jobrunnerdata.push({file:{
|
||||
path: path,
|
||||
data: data
|
||||
}});
|
||||
jobrunner.setData(jobrunnerdata);
|
||||
});
|
||||
}
|
||||
// process all File objects
|
||||
var i, files, div;
|
||||
files = (evt.target && evt.target.files) ||
|
||||
(evt.dataTransfer && evt.dataTransfer.files);
|
||||
if (files) {
|
||||
for (i = 0; files && i < files.length; i += 1) {
|
||||
div = doc.createElement("div");
|
||||
diagnoses.appendChild(div);
|
||||
diagnoseFile(files[i]);
|
||||
}
|
||||
} else {
|
||||
alert("File(s) could not be opened in this browser.");
|
||||
}
|
||||
}
|
||||
|
||||
function createForm() {
|
||||
var form = doc.createElement("form"),
|
||||
fieldset = doc.createElement("fieldset"),
|
||||
legend = doc.createElement("legend"),
|
||||
input = doc.createElement("input");
|
||||
form = doc.createElement("form");
|
||||
form.appendChild(fieldset);
|
||||
fieldset.appendChild(legend);
|
||||
input.setAttribute("type", "file");
|
||||
input.setAttribute("name", "fileselect[]");
|
||||
input.setAttribute("multiple", "multiple");
|
||||
input.addEventListener("change", fileSelectHandler, false);
|
||||
fieldset.appendChild(input);
|
||||
fieldset.appendChild(doc.createTextNode("or drop files here"));
|
||||
legend.appendChild(doc.createTextNode("docnosis"));
|
||||
form.addEventListener("dragover", dragHandler, false);
|
||||
form.addEventListener("dragleave", dragHandler, false);
|
||||
form.addEventListener("drop", fileSelectHandler, false);
|
||||
return form;
|
||||
}
|
||||
|
||||
function enhanceRuntime() {
|
||||
var read = runtime.read,
|
||||
getFileSize = runtime.getFileSize;
|
||||
runtime.read = function (path, offset, length, callback) {
|
||||
if (openedFiles.hasOwnProperty(path)) {
|
||||
return openedFiles[path].read(offset, length, callback);
|
||||
} else {
|
||||
return read(path, offset, length, callback);
|
||||
}
|
||||
};
|
||||
runtime.getFileSize = function (path, callback) {
|
||||
if (openedFiles.hasOwnProperty(path)) {
|
||||
return callback(openedFiles[path].file.size);
|
||||
} else {
|
||||
return getFileSize(path, callback);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
form = createForm();
|
||||
element.appendChild(form);
|
||||
element.appendChild(diagnoses);
|
||||
enhanceRuntime();
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
|
||||
<title>docnosis</title>
|
||||
<!-- <script src="../../webodf/webodf.js" type="text/javascript" charset="utf-8"></script> -->
|
||||
<script src="../../webodf/lib/runtime.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
runtime.libraryPaths = function () {
|
||||
return ["../../webodf/lib/"];
|
||||
};
|
||||
//]]></script>
|
||||
<script src="docnosis.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
runtime.libraryPaths = function () {
|
||||
return ["../../webodf/lib/"];
|
||||
};
|
||||
window.addEventListener("load", function () {
|
||||
var docnosis = document.getElementById("docnosis");
|
||||
new Docnosis(docnosis);
|
||||
}, false);
|
||||
//]]></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="docnosis"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,35 +0,0 @@
|
||||
# the files that go into the extension
|
||||
set(FIREFOXEXTENSIONFILES
|
||||
bootstrap.js
|
||||
chrome.manifest
|
||||
skin/default/icon.png
|
||||
content/odf.html
|
||||
components/odfContentHandler.js
|
||||
)
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/install.rdf.in
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/install.rdf)
|
||||
set(WEBODFXPI ${CMAKE_CURRENT_BINARY_DIR}/webodf-${WEBODF_VERSION}.xpi)
|
||||
add_custom_command(
|
||||
OUTPUT ${WEBODFXPI}
|
||||
# copy the common webodf.css and webodf.js
|
||||
COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different
|
||||
${CMAKE_SOURCE_DIR}/webodf/webodf.css
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/content/webodf.css
|
||||
COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different
|
||||
${CMAKE_BINARY_DIR}/webodf/webodf.js
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/content/webodf.js
|
||||
# zip using javascript code running in node.js
|
||||
COMMAND ${NODE} ARGS ../../webodf/lib/runtime.js packextension.js
|
||||
${WEBODFXPI}
|
||||
${FIREFOXEXTENSIONFILES}
|
||||
content/webodf.js
|
||||
content/webodf.css
|
||||
install.rdf
|
||||
DEPENDS NodeJS
|
||||
packextension.js ${FIREFOXEXTENSIONFILES}
|
||||
install.rdf.in
|
||||
${CMAKE_SOURCE_DIR}/webodf/webodf.css
|
||||
${CMAKE_BINARY_DIR}/webodf/webodf.js
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
add_custom_target(firefoxextension ALL DEPENDS ${WEBODFXPI})
|
||||
@@ -1,36 +0,0 @@
|
||||
/*global Components: true, dump: true, Services: true*/
|
||||
|
||||
var Cc = Components.classes;
|
||||
var Ci = Components.interfaces;
|
||||
var Cm = Components.manager;
|
||||
var Cu = Components.utils;
|
||||
|
||||
Cu["import"]('resource://gre/modules/Services.jsm');
|
||||
|
||||
function log(str) {
|
||||
"use strict";
|
||||
dump(str + '\n');
|
||||
}
|
||||
|
||||
function startup(aData, aReason) {
|
||||
"use strict";
|
||||
var manifestPath = 'chrome.manifest',
|
||||
file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
|
||||
try {
|
||||
file.initWithPath(aData.installPath.path);
|
||||
file.append(manifestPath);
|
||||
Cm.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(file);
|
||||
} catch (e) {
|
||||
log(e);
|
||||
}
|
||||
}
|
||||
|
||||
function shutdown(aData, aReason) {
|
||||
"use strict";
|
||||
}
|
||||
|
||||
function install(aData, aReason) {
|
||||
"use strict";
|
||||
var url = 'chrome://webodf.js/content/odf.html?file=%s';
|
||||
Services.prefs.setCharPref('extensions.webodf.js.url', url);
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
content webodf.js content/
|
||||
skin webodf.js default skin/default/
|
||||
|
||||
component {afe5fa21-709d-4916-b51c-56f60d574a0a} components/odfContentHandler.js
|
||||
contract @mozilla.org/uriloader/content-handler;1?type=application/vnd.oasis.opendocument.text {afe5fa21-709d-4916-b51c-56f60d574a0a}
|
||||
contract @mozilla.org/uriloader/content-handler;1?type=application/vnd.oasis.opendocument.spreadsheet {afe5fa21-709d-4916-b51c-56f60d574a0a}
|
||||
contract @mozilla.org/uriloader/content-handler;1?type=application/vnd.oasis.opendocument.presentation {afe5fa21-709d-4916-b51c-56f60d574a0a}
|
||||
category ext-to-type-mapping odt application/vnd.oasis.opendocument.text
|
||||
category ext-to-type-mapping fodt application/vnd.oasis.opendocument.text
|
||||
category ext-to-type-mapping ods application/vnd.oasis.opendocument.spreadsheet
|
||||
category ext-to-type-mapping fods application/vnd.oasis.opendocument.spreadsheet
|
||||
category ext-to-type-mapping odp application/vnd.oasis.opendocument.presentation
|
||||
category ext-to-type-mapping fodp application/vnd.oasis.opendocument.presentation
|
||||
@@ -1,196 +0,0 @@
|
||||
/*jslint bitwise: true*/
|
||||
/*global Components: true, dump: true, Uint8Array: true, Services: true,
|
||||
XPCOMUtils: true*/
|
||||
var Cc = Components.classes;
|
||||
var Ci = Components.interfaces;
|
||||
var Cr = Components.results;
|
||||
var Cu = Components.utils;
|
||||
|
||||
var ODF_CONTENT_TYPE_PREFIX = 'application/vnd.oasis.opendocument.';
|
||||
var NS_ERROR_WONT_HANDLE_CONTENT = 0x805d0001;
|
||||
|
||||
Cu["import"]('resource://gre/modules/XPCOMUtils.jsm');
|
||||
Cu["import"]('resource://gre/modules/Services.jsm');
|
||||
|
||||
function log(aMsg) {
|
||||
"use strict";
|
||||
var msg = 'odfContentHandler.js: ' + (aMsg.join ? aMsg.join('') : aMsg);
|
||||
Cc['@mozilla.org/consoleservice;1'].getService(Ci.nsIConsoleService)
|
||||
.logStringMessage(msg);
|
||||
dump(msg + '\n');
|
||||
}
|
||||
|
||||
function fireEventTo(aName, aData, aWindow) {
|
||||
"use strict";
|
||||
var mywindow = aWindow.wrappedJSObject,
|
||||
evt = mywindow.document.createEvent('CustomEvent');
|
||||
evt.initCustomEvent('odf' + aName, false, false, aData);
|
||||
mywindow.document.dispatchEvent(evt);
|
||||
}
|
||||
|
||||
function loadDocument(aWindow, aDocumentUrl) {
|
||||
"use strict";
|
||||
var xhr = Cc['@mozilla.org/xmlextras/xmlhttprequest;1']
|
||||
.createInstance(Ci.nsIXMLHttpRequest);
|
||||
xhr.onprogress = function updateProgress(evt) {
|
||||
if (evt.lengthComputable) {
|
||||
fireEventTo(evt.type, evt.loaded / evt.total, aWindow);
|
||||
}
|
||||
};
|
||||
|
||||
xhr.onerror = function error(evt) {
|
||||
fireEventTo(evt.type, false, aWindow);
|
||||
};
|
||||
|
||||
xhr.onload = function load(evt) {
|
||||
var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
|
||||
xhr.responseArrayBuffer || xhr.response),
|
||||
view,
|
||||
mywindow,
|
||||
arrayBuffer,
|
||||
view2,
|
||||
array,
|
||||
i;
|
||||
try {
|
||||
view = new Uint8Array(data);
|
||||
mywindow = aWindow.wrappedJSObject;
|
||||
arrayBuffer = new mywindow.ArrayBuffer(data.byteLength);
|
||||
view2 = new mywindow.Uint8Array(arrayBuffer);
|
||||
view2.set(view);
|
||||
array = [];
|
||||
array.length = view2.byteLength;
|
||||
for (i = 0; i < view2.byteLength; i += 1) {
|
||||
array[i] = view2[i];
|
||||
}
|
||||
fireEventTo(evt.type, array, aWindow);
|
||||
} catch (e) {
|
||||
log('Error - ' + e);
|
||||
}
|
||||
};
|
||||
|
||||
xhr.open('GET', aDocumentUrl);
|
||||
xhr.responseType = 'arraybuffer';
|
||||
xhr.send(null);
|
||||
}
|
||||
|
||||
var WebProgressListener = {
|
||||
init: function WebProgressListenerInit(aWindow, aUrl) {
|
||||
"use strict";
|
||||
this.locationHasChanged = false;
|
||||
this.documentUrl = aUrl;
|
||||
|
||||
var flags = Ci.nsIWebProgress.NOTIFY_LOCATION |
|
||||
Ci.nsIWebProgress.NOTIFY_STATE_NETWORK |
|
||||
Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT,
|
||||
docShell = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
.getInterface(Ci.nsIWebNavigation)
|
||||
.QueryInterface(Ci.nsIDocShell),
|
||||
webProgress = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||
.getInterface(Ci.nsIWebProgress);
|
||||
try {
|
||||
webProgress.removeProgressListener(this);
|
||||
} catch (e) {
|
||||
}
|
||||
webProgress.addProgressListener(this, flags);
|
||||
},
|
||||
|
||||
onStateChange: function onStateChange(aWebProgress, aRequest, aStateFlags,
|
||||
aStatus) {
|
||||
"use strict";
|
||||
var complete = Ci.nsIWebProgressListener.STATE_IS_WINDOW +
|
||||
Ci.nsIWebProgressListener.STATE_STOP;
|
||||
if ((aStateFlags & complete) === complete && this.locationHasChanged) {
|
||||
aWebProgress.removeProgressListener(this);
|
||||
loadDocument(aWebProgress.DOMWindow, this.documentUrl);
|
||||
}
|
||||
},
|
||||
|
||||
onProgressChange: function onProgressChange(aWebProgress, aRequest,
|
||||
aCurSelf, aMaxSelf, aCurTotal,
|
||||
aMaxTotal) {
|
||||
"use strict";
|
||||
},
|
||||
|
||||
onLocationChange: function onLocationChange(aWebProgress, aRequest,
|
||||
aLocationURI) {
|
||||
"use strict";
|
||||
this.locationHasChanged = true;
|
||||
},
|
||||
|
||||
onStatusChange: function onStatusChange(aWebProgress, aRequest, aStatus,
|
||||
aMessage) {
|
||||
"use strict";
|
||||
},
|
||||
|
||||
onSecurityChange: function onSecurityChange(aWebProgress, aRequest, aState) {
|
||||
"use strict";
|
||||
},
|
||||
|
||||
QueryInterface: function QueryInterface(aIID) {
|
||||
"use strict";
|
||||
if (aIID.equals(Ci.nsIWebProgressListener) ||
|
||||
aIID.equals(Ci.nsISupportsWeakReference) ||
|
||||
aIID.equals(Ci.nsISupports)) {
|
||||
return this;
|
||||
}
|
||||
throw Components.results.NS_ERROR_NO_INTERFACE;
|
||||
}
|
||||
};
|
||||
|
||||
function odfContentHandler() {
|
||||
"use strict";
|
||||
}
|
||||
|
||||
odfContentHandler.prototype = {
|
||||
handleContent: function handleContent(aMimetype, aContext, aRequest) {
|
||||
"use strict";
|
||||
|
||||
if (!(aMimetype.indexOf(ODF_CONTENT_TYPE_PREFIX) === 0 ||
|
||||
aMimetype === "application/octet-stream")) {
|
||||
throw NS_ERROR_WONT_HANDLE_CONTENT;
|
||||
}
|
||||
|
||||
if (!(aRequest instanceof Ci.nsIChannel)) {
|
||||
throw NS_ERROR_WONT_HANDLE_CONTENT;
|
||||
}
|
||||
|
||||
var mywindow = null,
|
||||
callbacks,
|
||||
uri = aRequest.URI,
|
||||
targetUrl = uri.spec,
|
||||
tail = targetUrl.substring(targetUrl.length-9),
|
||||
url;
|
||||
|
||||
// if the url ends with a download parameter, then do not handle it
|
||||
if (tail === "#download") {
|
||||
throw NS_ERROR_WONT_HANDLE_CONTENT;
|
||||
}
|
||||
|
||||
callbacks = aRequest.notificationCallbacks ||
|
||||
aRequest.loadGroup.notificationCallbacks;
|
||||
if (!callbacks) {
|
||||
return;
|
||||
}
|
||||
|
||||
mywindow = callbacks.getInterface(Ci.nsIDOMWindow);
|
||||
|
||||
WebProgressListener.init(mywindow, uri.spec);
|
||||
|
||||
try {
|
||||
url = Services.prefs.getCharPref('extensions.webodf.js.url');
|
||||
//url = url.replace('%s', encodeURIComponent(targetUrl));
|
||||
url = url.replace('%s', targetUrl);
|
||||
} catch (e) {
|
||||
log('Error retrieving the webodf base url - ' + e);
|
||||
throw NS_ERROR_WONT_HANDLE_CONTENT;
|
||||
}
|
||||
|
||||
aRequest.cancel(Cr.NS_BINDING_ABORTED);
|
||||
mywindow.location = url;
|
||||
},
|
||||
|
||||
classID: Components.ID('{afe5fa21-709d-4916-b51c-56f60d574a0a}'),
|
||||
QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentHandler])
|
||||
};
|
||||
|
||||
var NSGetFactory = XPCOMUtils.generateNSGetFactory([odfContentHandler]);
|
||||
@@ -1,89 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
|
||||
<style type="text/css" media="screen">
|
||||
body, html, div {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
border: 0px;
|
||||
}
|
||||
body, html {
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
html > body {
|
||||
background: black;
|
||||
}
|
||||
div#toolbar {
|
||||
background: white;
|
||||
padding: 7px;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
div#toolbar > span {
|
||||
border: 1px solid black;
|
||||
padding: 2px;
|
||||
}
|
||||
div#toolbar > span:hover {
|
||||
background: #CCCCCC;
|
||||
}
|
||||
</style>
|
||||
<link rel="stylesheet" type="text/css" href="webodf.css"/>
|
||||
<script src="webodf.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script type="text/javascript" charset="utf-8">//<![CDATA[
|
||||
var webodffirefox = {
|
||||
url: undefined,
|
||||
data: undefined,
|
||||
odfcanvas: undefined
|
||||
};
|
||||
window.addEventListener('odfload', function webViewerLoad(evt) {
|
||||
runtime.loadClass("odf.OdfCanvas");
|
||||
var wf = webodffirefox,
|
||||
params = document.location.search.substring(1).split('&'),
|
||||
param,
|
||||
odfelement = document.getElementById("odf"),
|
||||
data = evt.detail;
|
||||
for (i = 0; i < params.length; i += 1) {
|
||||
param = params[i].split('=');
|
||||
params[unescape(param[0])] = unescape(param[1]);
|
||||
}
|
||||
wf.url = params.file;
|
||||
wf.data = data;
|
||||
wf.odfcanvas = new odf.OdfCanvas(odfelement);
|
||||
|
||||
runtime.read = function (path, offset, length, callback) {
|
||||
var d = data.slice(offset, offset + length);
|
||||
callback(null, d);
|
||||
}
|
||||
runtime.getFileSize = function (path, callback) {
|
||||
callback(data.length);
|
||||
}
|
||||
wf.odfcanvas.load(params.file);
|
||||
}, true);
|
||||
function addButton(parent, label, onclick) {
|
||||
var doc = parent.ownerDocument,
|
||||
button = doc.createElement("span");
|
||||
button.appendChild(doc.createTextNode(label));
|
||||
button.onclick = onclick;
|
||||
parent.appendChild(button);
|
||||
}
|
||||
function init() {
|
||||
runtime.loadClass("core.Base64");
|
||||
var toolbar = document.getElementById("toolbar");
|
||||
addButton(toolbar, "download", function onclick() {
|
||||
window.location.href = webodffirefox.url + "#download";
|
||||
});
|
||||
}
|
||||
window.setTimeout(function () {
|
||||
init();
|
||||
}, 1);
|
||||
//--></script>
|
||||
<title></title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="toolbar">
|
||||
</div>
|
||||
<div id="odf"/>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,34 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
|
||||
|
||||
<Description about="urn:mozilla:install-manifest">
|
||||
<em:id>uriloader@webodf.js</em:id>
|
||||
<em:name>WebODF</em:name>
|
||||
<em:type>2</em:type>
|
||||
<em:version>@WEBODF_VERSION@</em:version>
|
||||
<em:iconURL>chrome://webodf.js/skin/icon.png</em:iconURL>
|
||||
<em:targetApplication>
|
||||
<!-- Firefox -->
|
||||
<Description>
|
||||
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
|
||||
<em:minVersion>3.6</em:minVersion>
|
||||
<em:maxVersion>9.*</em:maxVersion>
|
||||
</Description>
|
||||
</em:targetApplication>
|
||||
<em:targetApplication>
|
||||
<!-- Fennec -->
|
||||
<Description>
|
||||
<em:id>{a23983c0-fd0e-11dc-95ff-0800200c9a66}</em:id>
|
||||
<em:minVersion>4.0</em:minVersion>
|
||||
<em:maxVersion>9.*</em:maxVersion>
|
||||
</Description>
|
||||
</em:targetApplication>
|
||||
<em:bootstrap>true</em:bootstrap>
|
||||
<em:unpack>true</em:unpack>
|
||||
<em:creator>Jos van den Oever</em:creator>
|
||||
<em:description>OpenDocument Viewer</em:description>
|
||||
<em:homepageURL>http://webodf.org/</em:homepageURL>
|
||||
</Description>
|
||||
</RDF>
|
||||
@@ -1,77 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) 2011 KO GmbH <jos.van.den.oever@kogmbh.com>
|
||||
* @licstart
|
||||
* The JavaScript code in this page is free software: you can redistribute it
|
||||
* and/or modify it under the terms of the GNU Affero General Public License
|
||||
* (GNU AGPL) as published by the Free Software Foundation, either version 3 of
|
||||
* the License, or (at your option) any later version. The code is distributed
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details.
|
||||
*
|
||||
* As additional permission under GNU AGPL version 3 section 7, you
|
||||
* may distribute non-source (e.g., minimized or compacted) forms of
|
||||
* that code without the copy of the GNU GPL normally required by
|
||||
* section 4, provided you include this license notice and a URL
|
||||
* through which recipients can access the Corresponding Source.
|
||||
*
|
||||
* As a special exception to the AGPL, any HTML file which merely makes function
|
||||
* calls to this code, and for that purpose includes it by reference shall be
|
||||
* deemed a separate work for copyright law purposes. In addition, the copyright
|
||||
* holders of this code give you permission to combine this code with free
|
||||
* software libraries that are released under the GNU LGPL. You may copy and
|
||||
* distribute such a system following the terms of the GNU AGPL for this code
|
||||
* and the LGPL for the libraries. If you modify this code, you may extend this
|
||||
* exception to your version of the code, but you are not obligated to do so.
|
||||
* If you do not wish to do so, delete this exception statement from your
|
||||
* version.
|
||||
*
|
||||
* This license applies to this entire compilation.
|
||||
* @licend
|
||||
* @source: http://www.webodf.org/
|
||||
* @source: http://gitorious.org/odfkit/webodf/
|
||||
*/
|
||||
/*global runtime: true, core: true*/
|
||||
runtime.loadClass("core.Zip");
|
||||
runtime.loadClass("core.Base64");
|
||||
|
||||
function addFiles(zip, pos, files, callback) {
|
||||
"use strict";
|
||||
if (pos >= files.length) {
|
||||
zip.write(function (err) {
|
||||
return callback(err);
|
||||
});
|
||||
return;
|
||||
}
|
||||
var path = files[pos];
|
||||
runtime.readFile(path, "binary", function (err, data) {
|
||||
var base64;
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
if (path === "content/webodf.js") {
|
||||
// replace eval() with evil(), since Firefox does not approve of it
|
||||
base64 = new core.Base64();
|
||||
data = base64.convertUTF8ArrayToUTF16String(data);
|
||||
data = data.replace(new RegExp('eval\\(', 'g'), 'evil(');
|
||||
data = runtime.byteArrayFromString(data);
|
||||
}
|
||||
zip.save(path, data, false, new Date());
|
||||
addFiles(zip, pos + 1, files, callback);
|
||||
});
|
||||
}
|
||||
|
||||
var args = arguments,
|
||||
filename = args[1],
|
||||
zipmembers = [],
|
||||
i,
|
||||
zip = new core.Zip(filename, null);
|
||||
for (i = 2; i < arguments.length; i += 1) {
|
||||
zipmembers.push(arguments[i]);
|
||||
}
|
||||
|
||||
addFiles(zip, 0, zipmembers, function (err) {
|
||||
"use strict";
|
||||
if (err) {
|
||||
runtime.log(err);
|
||||
}
|
||||
});
|
||||
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 51 KiB |
@@ -1,512 +0,0 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
CB099EC714DAC535000D7B99 /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = CB099EC614DAC535000D7B99 /* Default-Portrait~ipad.png */; };
|
||||
CB099EC914DAC53D000D7B99 /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = CB099EC814DAC53D000D7B99 /* Default-Landscape~ipad.png */; };
|
||||
CB29ECBD14FFBBBB00CEAEE3 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = CB29ECBC14FFBBBB00CEAEE3 /* unzip.c */; };
|
||||
CB29ECBF14FFBC0500CEAEE3 /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = CB29ECBE14FFBC0500CEAEE3 /* ioapi.c */; };
|
||||
CB29ECC114FFBC1B00CEAEE3 /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = CB29ECC014FFBC1B00CEAEE3 /* mztools.c */; };
|
||||
CB29ECC314FFBC5500CEAEE3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CB29ECC214FFBC5500CEAEE3 /* libz.dylib */; };
|
||||
CB36D11814F68F7F0084BECB /* www in Resources */ = {isa = PBXBuildFile; fileRef = CB36D11714F68F7F0084BECB /* www */; };
|
||||
CB533D9114DABDA600C733F6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9014DABDA600C733F6 /* Foundation.framework */; };
|
||||
CB533D9314DABDA600C733F6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9214DABDA600C733F6 /* UIKit.framework */; };
|
||||
CB533D9514DABDA600C733F6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9414DABDA600C733F6 /* CoreGraphics.framework */; };
|
||||
CB533D9714DABDA600C733F6 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9614DABDA600C733F6 /* AddressBook.framework */; };
|
||||
CB533D9914DABDA600C733F6 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9814DABDA600C733F6 /* AddressBookUI.framework */; };
|
||||
CB533D9B14DABDA600C733F6 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9A14DABDA600C733F6 /* AudioToolbox.framework */; };
|
||||
CB533D9D14DABDA600C733F6 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9C14DABDA600C733F6 /* AVFoundation.framework */; };
|
||||
CB533D9F14DABDA600C733F6 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9E14DABDA600C733F6 /* CoreLocation.framework */; };
|
||||
CB533DA114DABDA600C733F6 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA014DABDA600C733F6 /* MediaPlayer.framework */; };
|
||||
CB533DA314DABDA600C733F6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA214DABDA600C733F6 /* QuartzCore.framework */; };
|
||||
CB533DA514DABDA600C733F6 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA414DABDA600C733F6 /* SystemConfiguration.framework */; };
|
||||
CB533DA714DABDA600C733F6 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA614DABDA600C733F6 /* MobileCoreServices.framework */; };
|
||||
CB533DA914DABDA600C733F6 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA814DABDA600C733F6 /* CoreMedia.framework */; };
|
||||
CB533DAF14DABDA600C733F6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = CB533DAD14DABDA600C733F6 /* InfoPlist.strings */; };
|
||||
CB533DB114DABDA600C733F6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CB533DB014DABDA600C733F6 /* main.m */; };
|
||||
CB533DB414DABDA600C733F6 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DB314DABDA600C733F6 /* PhoneGap.framework */; };
|
||||
CB533DB914DABDA600C733F6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = CB533DB714DABDA600C733F6 /* Localizable.strings */; };
|
||||
CB533DC014DABDA600C733F6 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DBF14DABDA600C733F6 /* icon.png */; };
|
||||
CB533DC214DABDA600C733F6 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC114DABDA600C733F6 /* icon@2x.png */; };
|
||||
CB533DC414DABDA600C733F6 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC314DABDA600C733F6 /* icon-72.png */; };
|
||||
CB533DC714DABDA600C733F6 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC614DABDA600C733F6 /* Default.png */; };
|
||||
CB533DC914DABDA600C733F6 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC814DABDA600C733F6 /* Default@2x.png */; };
|
||||
CB533DCD14DABDA600C733F6 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = CB533DCC14DABDA600C733F6 /* PhoneGap.plist */; };
|
||||
CB533DD114DABDA600C733F6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CB533DD014DABDA600C733F6 /* AppDelegate.m */; };
|
||||
CB533DD414DABDA600C733F6 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CB533DD314DABDA600C733F6 /* MainViewController.m */; };
|
||||
CB533DD614DABDA600C733F6 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB533DD514DABDA600C733F6 /* MainViewController.xib */; };
|
||||
CBD2B77314FF8E9700FC3A44 /* NativeZip.m in Sources */ = {isa = PBXBuildFile; fileRef = CBD2B77214FF8E9700FC3A44 /* NativeZip.m */; };
|
||||
CBDCA69D1504EAEB00C706C7 /* WebViewCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CBDCA69C1504EAEB00C706C7 /* WebViewCache.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
CB099EC614DAC535000D7B99 /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait~ipad.png"; path = "../Default-Portrait~ipad.png"; sourceTree = "<group>"; };
|
||||
CB099EC814DAC53D000D7B99 /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape~ipad.png"; path = "../Default-Landscape~ipad.png"; sourceTree = "<group>"; };
|
||||
CB29ECBC14FFBBBB00CEAEE3 /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unzip.c; path = WebODF/Classes/minizip/unzip.c; sourceTree = "<group>"; };
|
||||
CB29ECBE14FFBC0500CEAEE3 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ioapi.c; path = WebODF/Classes/minizip/ioapi.c; sourceTree = "<group>"; };
|
||||
CB29ECC014FFBC1B00CEAEE3 /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mztools.c; path = WebODF/Classes/minizip/mztools.c; sourceTree = "<group>"; };
|
||||
CB29ECC214FFBC5500CEAEE3 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
|
||||
CB36D11714F68F7F0084BECB /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = "<group>"; };
|
||||
CB533D8C14DABDA500C733F6 /* KO Viewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "KO Viewer.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
CB533D9014DABDA600C733F6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
CB533D9214DABDA600C733F6 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
||||
CB533D9414DABDA600C733F6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
||||
CB533D9614DABDA600C733F6 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; };
|
||||
CB533D9814DABDA600C733F6 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; };
|
||||
CB533D9A14DABDA600C733F6 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
|
||||
CB533D9C14DABDA600C733F6 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
|
||||
CB533D9E14DABDA600C733F6 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
|
||||
CB533DA014DABDA600C733F6 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; };
|
||||
CB533DA214DABDA600C733F6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
|
||||
CB533DA414DABDA600C733F6 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
||||
CB533DA614DABDA600C733F6 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
|
||||
CB533DA814DABDA600C733F6 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
|
||||
CB533DAC14DABDA600C733F6 /* WebODF-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WebODF-Info.plist"; sourceTree = "<group>"; };
|
||||
CB533DAE14DABDA600C733F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
CB533DB014DABDA600C733F6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||
CB533DB214DABDA600C733F6 /* WebODF-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WebODF-Prefix.pch"; sourceTree = "<group>"; };
|
||||
CB533DB314DABDA600C733F6 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = "<absolute>"; };
|
||||
CB533DB814DABDA600C733F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
CB533DBF14DABDA600C733F6 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = "<group>"; };
|
||||
CB533DC114DABDA600C733F6 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = "<group>"; };
|
||||
CB533DC314DABDA600C733F6 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = "<group>"; };
|
||||
CB533DC614DABDA600C733F6 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = "<group>"; };
|
||||
CB533DC814DABDA600C733F6 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = "<group>"; };
|
||||
CB533DCC14DABDA600C733F6 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = "<group>"; };
|
||||
CB533DCF14DABDA600C733F6 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = "<group>"; };
|
||||
CB533DD014DABDA600C733F6 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = "<group>"; };
|
||||
CB533DD214DABDA600C733F6 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = "<group>"; };
|
||||
CB533DD314DABDA600C733F6 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = "<group>"; };
|
||||
CB533DD514DABDA600C733F6 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = "<group>"; };
|
||||
CBD2B77114FF8E9700FC3A44 /* NativeZip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NativeZip.h; path = Classes/NativeZip.h; sourceTree = "<group>"; };
|
||||
CBD2B77214FF8E9700FC3A44 /* NativeZip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NativeZip.m; path = Classes/NativeZip.m; sourceTree = "<group>"; };
|
||||
CBDCA69B1504EAEB00C706C7 /* WebViewCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebViewCache.h; path = Classes/WebViewCache.h; sourceTree = "<group>"; };
|
||||
CBDCA69C1504EAEB00C706C7 /* WebViewCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WebViewCache.m; path = Classes/WebViewCache.m; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
CB533D8614DABDA500C733F6 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
CB29ECC314FFBC5500CEAEE3 /* libz.dylib in Frameworks */,
|
||||
CB533D9114DABDA600C733F6 /* Foundation.framework in Frameworks */,
|
||||
CB533D9314DABDA600C733F6 /* UIKit.framework in Frameworks */,
|
||||
CB533D9514DABDA600C733F6 /* CoreGraphics.framework in Frameworks */,
|
||||
CB533D9714DABDA600C733F6 /* AddressBook.framework in Frameworks */,
|
||||
CB533D9914DABDA600C733F6 /* AddressBookUI.framework in Frameworks */,
|
||||
CB533D9B14DABDA600C733F6 /* AudioToolbox.framework in Frameworks */,
|
||||
CB533D9D14DABDA600C733F6 /* AVFoundation.framework in Frameworks */,
|
||||
CB533D9F14DABDA600C733F6 /* CoreLocation.framework in Frameworks */,
|
||||
CB533DA114DABDA600C733F6 /* MediaPlayer.framework in Frameworks */,
|
||||
CB533DA314DABDA600C733F6 /* QuartzCore.framework in Frameworks */,
|
||||
CB533DA514DABDA600C733F6 /* SystemConfiguration.framework in Frameworks */,
|
||||
CB533DA714DABDA600C733F6 /* MobileCoreServices.framework in Frameworks */,
|
||||
CB533DA914DABDA600C733F6 /* CoreMedia.framework in Frameworks */,
|
||||
CB533DB414DABDA600C733F6 /* PhoneGap.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
CB533D8914DABDA500C733F6 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
CB533D7E14DABDA500C733F6 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CB29ECC214FFBC5500CEAEE3 /* libz.dylib */,
|
||||
CB29ECC014FFBC1B00CEAEE3 /* mztools.c */,
|
||||
CB29ECBE14FFBC0500CEAEE3 /* ioapi.c */,
|
||||
CB29ECBC14FFBBBB00CEAEE3 /* unzip.c */,
|
||||
CB36D11714F68F7F0084BECB /* www */,
|
||||
CB533DAA14DABDA600C733F6 /* WebODF */,
|
||||
CB533D8F14DABDA500C733F6 /* Frameworks */,
|
||||
CB533D8D14DABDA500C733F6 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB533D8D14DABDA500C733F6 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CB533D8C14DABDA500C733F6 /* KO Viewer.app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB533D8F14DABDA500C733F6 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CB533D9014DABDA600C733F6 /* Foundation.framework */,
|
||||
CB533D9214DABDA600C733F6 /* UIKit.framework */,
|
||||
CB533D9414DABDA600C733F6 /* CoreGraphics.framework */,
|
||||
CB533D9614DABDA600C733F6 /* AddressBook.framework */,
|
||||
CB533D9814DABDA600C733F6 /* AddressBookUI.framework */,
|
||||
CB533D9A14DABDA600C733F6 /* AudioToolbox.framework */,
|
||||
CB533D9C14DABDA600C733F6 /* AVFoundation.framework */,
|
||||
CB533D9E14DABDA600C733F6 /* CoreLocation.framework */,
|
||||
CB533DA014DABDA600C733F6 /* MediaPlayer.framework */,
|
||||
CB533DA214DABDA600C733F6 /* QuartzCore.framework */,
|
||||
CB533DA414DABDA600C733F6 /* SystemConfiguration.framework */,
|
||||
CB533DA614DABDA600C733F6 /* MobileCoreServices.framework */,
|
||||
CB533DA814DABDA600C733F6 /* CoreMedia.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB533DAA14DABDA600C733F6 /* WebODF */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CB533DB314DABDA600C733F6 /* PhoneGap.framework */,
|
||||
CB533DB514DABDA600C733F6 /* Resources */,
|
||||
CB533DCE14DABDA600C733F6 /* Classes */,
|
||||
CB533DAB14DABDA600C733F6 /* Supporting Files */,
|
||||
);
|
||||
path = WebODF;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB533DAB14DABDA600C733F6 /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CB533DAC14DABDA600C733F6 /* WebODF-Info.plist */,
|
||||
CB533DAD14DABDA600C733F6 /* InfoPlist.strings */,
|
||||
CB533DB014DABDA600C733F6 /* main.m */,
|
||||
CB533DB214DABDA600C733F6 /* WebODF-Prefix.pch */,
|
||||
CB533DCC14DABDA600C733F6 /* PhoneGap.plist */,
|
||||
CB533DD514DABDA600C733F6 /* MainViewController.xib */,
|
||||
);
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB533DB514DABDA600C733F6 /* Resources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CB533DB614DABDA600C733F6 /* en.lproj */,
|
||||
CB533DBE14DABDA600C733F6 /* icons */,
|
||||
CB533DC514DABDA600C733F6 /* splash */,
|
||||
);
|
||||
name = Resources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB533DB614DABDA600C733F6 /* en.lproj */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CB533DB714DABDA600C733F6 /* Localizable.strings */,
|
||||
);
|
||||
name = en.lproj;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB533DBE14DABDA600C733F6 /* icons */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CB533DBF14DABDA600C733F6 /* icon.png */,
|
||||
CB533DC114DABDA600C733F6 /* icon@2x.png */,
|
||||
CB533DC314DABDA600C733F6 /* icon-72.png */,
|
||||
);
|
||||
name = icons;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB533DC514DABDA600C733F6 /* splash */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CB099EC814DAC53D000D7B99 /* Default-Landscape~ipad.png */,
|
||||
CB099EC614DAC535000D7B99 /* Default-Portrait~ipad.png */,
|
||||
CB533DC614DABDA600C733F6 /* Default.png */,
|
||||
CB533DC814DABDA600C733F6 /* Default@2x.png */,
|
||||
);
|
||||
name = splash;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB533DCE14DABDA600C733F6 /* Classes */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CBDCA69B1504EAEB00C706C7 /* WebViewCache.h */,
|
||||
CBDCA69C1504EAEB00C706C7 /* WebViewCache.m */,
|
||||
CB533DCF14DABDA600C733F6 /* AppDelegate.h */,
|
||||
CB533DD014DABDA600C733F6 /* AppDelegate.m */,
|
||||
CB533DD214DABDA600C733F6 /* MainViewController.h */,
|
||||
CB533DD314DABDA600C733F6 /* MainViewController.m */,
|
||||
CBD2B77114FF8E9700FC3A44 /* NativeZip.h */,
|
||||
CBD2B77214FF8E9700FC3A44 /* NativeZip.m */,
|
||||
);
|
||||
name = Classes;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
CB533D8B14DABDA500C733F6 /* KO Viewer */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = CB533DDB14DABDA600C733F6 /* Build configuration list for PBXNativeTarget "KO Viewer" */;
|
||||
buildPhases = (
|
||||
CB533D8514DABDA500C733F6 /* Sources */,
|
||||
CB533D8614DABDA500C733F6 /* Frameworks */,
|
||||
CB533D8714DABDA500C733F6 /* Resources */,
|
||||
CB533D8814DABDA500C733F6 /* Sources */,
|
||||
CB533D8914DABDA500C733F6 /* Frameworks */,
|
||||
CB533D8A14DABDA500C733F6 /* ShellScript */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = "KO Viewer";
|
||||
productName = WebODF;
|
||||
productReference = CB533D8C14DABDA500C733F6 /* KO Viewer.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
CB533D8014DABDA500C733F6 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0420;
|
||||
};
|
||||
buildConfigurationList = CB533D8314DABDA500C733F6 /* Build configuration list for PBXProject "WebODF" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
es,
|
||||
);
|
||||
mainGroup = CB533D7E14DABDA500C733F6;
|
||||
productRefGroup = CB533D8D14DABDA500C733F6 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
CB533D8B14DABDA500C733F6 /* KO Viewer */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
CB533D8714DABDA500C733F6 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
CB533DAF14DABDA600C733F6 /* InfoPlist.strings in Resources */,
|
||||
CB533DB914DABDA600C733F6 /* Localizable.strings in Resources */,
|
||||
CB533DC014DABDA600C733F6 /* icon.png in Resources */,
|
||||
CB533DC214DABDA600C733F6 /* icon@2x.png in Resources */,
|
||||
CB533DC414DABDA600C733F6 /* icon-72.png in Resources */,
|
||||
CB533DC714DABDA600C733F6 /* Default.png in Resources */,
|
||||
CB533DC914DABDA600C733F6 /* Default@2x.png in Resources */,
|
||||
CB533DCD14DABDA600C733F6 /* PhoneGap.plist in Resources */,
|
||||
CB533DD614DABDA600C733F6 /* MainViewController.xib in Resources */,
|
||||
CB099EC714DAC535000D7B99 /* Default-Portrait~ipad.png in Resources */,
|
||||
CB099EC914DAC53D000D7B99 /* Default-Landscape~ipad.png in Resources */,
|
||||
CB36D11814F68F7F0084BECB /* www in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
CB533D8A14DABDA500C733F6 /* ShellScript */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/bash;
|
||||
shellScript = "rsync -a ../touchui/app/ www/app/\ncp ../../webodf/webodf.css www/\ncp ../touchui/sencha-touch.* www/\ncp ../touchui/Zoom*.png www/\nif [ ! -e www/webodf.js ]; then\n # webodf.js should be built\n if [ ! -e build ]; then mkdir build; fi\n cd build\n cmake -G Xcode ../../.. && make && cp webodf/webodf.js ..\n if [ ! -e webodf.js ]; then\n echo \"put webodf.js in the ios/www directory\"\n exit 1;\n fi\nfi\n";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
CB533D8514DABDA500C733F6 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
CB533DB114DABDA600C733F6 /* main.m in Sources */,
|
||||
CB533DD114DABDA600C733F6 /* AppDelegate.m in Sources */,
|
||||
CB533DD414DABDA600C733F6 /* MainViewController.m in Sources */,
|
||||
CBD2B77314FF8E9700FC3A44 /* NativeZip.m in Sources */,
|
||||
CB29ECBD14FFBBBB00CEAEE3 /* unzip.c in Sources */,
|
||||
CB29ECBF14FFBC0500CEAEE3 /* ioapi.c in Sources */,
|
||||
CB29ECC114FFBC1B00CEAEE3 /* mztools.c in Sources */,
|
||||
CBDCA69D1504EAEB00C706C7 /* WebViewCache.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
CB533D8814DABDA500C733F6 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
CB533DAD14DABDA600C733F6 /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
CB533DAE14DABDA600C733F6 /* en */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB533DB714DABDA600C733F6 /* Localizable.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
CB533DB814DABDA600C733F6 /* en */,
|
||||
);
|
||||
name = Localizable.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
CB533DD914DABDA600C733F6 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 3.0;
|
||||
SDKROOT = iphoneos;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
CB533DDA14DABDA600C733F6 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ARCHS = "$(ARCHS_STANDARD_32_BIT)";
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 3.0;
|
||||
SDKROOT = iphoneos;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
CB533DDC14DABDA600C733F6 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = YES;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer: Jos van den Oever (GJ9RDPR233)";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "WebODF/WebODF-Prefix.pch";
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES";
|
||||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||
INFOPLIST_FILE = "WebODF/WebODF-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 5.0;
|
||||
OTHER_LDFLAGS = (
|
||||
"-weak_framework",
|
||||
UIKit,
|
||||
"-weak_framework",
|
||||
AVFoundation,
|
||||
"-weak_framework",
|
||||
CoreMedia,
|
||||
"-weak_library",
|
||||
/usr/lib/libSystem.B.dylib,
|
||||
);
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE = "8A253628-DC77-4EEA-8543-53315AA93987";
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
CB533DDD14DABDA600C733F6 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = YES;
|
||||
ARCHS = (
|
||||
armv6,
|
||||
"$(ARCHS_STANDARD_32_BIT)",
|
||||
);
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer: Jos van den Oever (GJ9RDPR233)";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "WebODF/WebODF-Prefix.pch";
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES";
|
||||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||
INFOPLIST_FILE = "WebODF/WebODF-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 5.0;
|
||||
OTHER_LDFLAGS = (
|
||||
"-weak_framework",
|
||||
UIKit,
|
||||
"-weak_framework",
|
||||
AVFoundation,
|
||||
"-weak_framework",
|
||||
CoreMedia,
|
||||
"-weak_library",
|
||||
/usr/lib/libSystem.B.dylib,
|
||||
);
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE = "8A253628-DC77-4EEA-8543-53315AA93987";
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
WRAPPER_EXTENSION = app;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
CB533D8314DABDA500C733F6 /* Build configuration list for PBXProject "WebODF" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
CB533DD914DABDA600C733F6 /* Debug */,
|
||||
CB533DDA14DABDA600C733F6 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
CB533DDB14DABDA600C733F6 /* Build configuration list for PBXNativeTarget "KO Viewer" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
CB533DDC14DABDA600C733F6 /* Debug */,
|
||||
CB533DDD14DABDA600C733F6 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = CB533D8014DABDA500C733F6 /* Project object */;
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
//
|
||||
// AppDelegate.h
|
||||
// WebODF
|
||||
//
|
||||
// Created by KO GmbH on 2/2/12.
|
||||
// Copyright __MyCompanyName__ 2012. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#ifdef PHONEGAP_FRAMEWORK
|
||||
#import <PhoneGap/PGViewController.h>
|
||||
#else
|
||||
#import "PGViewController.h"
|
||||
#endif
|
||||
|
||||
|
||||
@interface AppDelegate : NSObject < UIApplicationDelegate, UIWebViewDelegate, PGCommandDelegate > {
|
||||
|
||||
NSString* invokeString;
|
||||
}
|
||||
|
||||
// invoke string is passed to your app on launch, this is only valid if you
|
||||
// edit FooBar.plist to add a protocol
|
||||
// a simple tutorial can be found here :
|
||||
// http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
|
||||
|
||||
@property (nonatomic, copy) NSString* invokeString;
|
||||
@property (nonatomic, retain) IBOutlet UIWindow* window;
|
||||
@property (nonatomic, retain) IBOutlet PGViewController* viewController;
|
||||
|
||||
@end
|
||||
|
||||
@@ -1,202 +0,0 @@
|
||||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
//
|
||||
// AppDelegate.m
|
||||
// WebODF
|
||||
//
|
||||
// Created by KO GmbH on 2/2/12.
|
||||
// Copyright __MyCompanyName__ 2012. All rights reserved.
|
||||
//
|
||||
|
||||
#import "AppDelegate.h"
|
||||
#import "MainViewController.h"
|
||||
|
||||
#ifdef PHONEGAP_FRAMEWORK
|
||||
#import <PhoneGap/PGPlugin.h>
|
||||
#import <PhoneGap/PGURLProtocol.h>
|
||||
#else
|
||||
#import "PGPlugin.h"
|
||||
#import "PGURLProtocol.h"
|
||||
#endif
|
||||
#import "WebViewCache.h"
|
||||
|
||||
|
||||
@implementation AppDelegate
|
||||
|
||||
@synthesize invokeString, window, viewController;
|
||||
|
||||
- (id) init
|
||||
{
|
||||
/** If you need to do any extra app-specific initialization, you can do it here
|
||||
* -jm
|
||||
**/
|
||||
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
|
||||
[cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
|
||||
|
||||
[PGURLProtocol registerPGHttpURLProtocol];
|
||||
|
||||
return [super init];
|
||||
}
|
||||
|
||||
#pragma UIApplicationDelegate implementation
|
||||
|
||||
/**
|
||||
* This is main kick off after the app inits, the views and Settings are setup here. (preferred - iOS4 and up)
|
||||
*/
|
||||
- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
|
||||
{
|
||||
NSURL* url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
|
||||
if (url && [url isKindOfClass:[NSURL class]]) {
|
||||
self.invokeString = [url absoluteString];
|
||||
NSLog(@"WebODF launchOptions = %@", url);
|
||||
}
|
||||
|
||||
CGRect screenBounds = [[UIScreen mainScreen] bounds];
|
||||
self.window = [[UIWindow alloc] initWithFrame:screenBounds];
|
||||
self.window.autoresizesSubviews = YES;
|
||||
|
||||
CGRect viewBounds = [[UIScreen mainScreen] applicationFrame];
|
||||
|
||||
self.viewController = [[MainViewController alloc] init];
|
||||
self.viewController.useSplashScreen = YES;
|
||||
self.viewController.wwwFolderName = @"www";
|
||||
self.viewController.startPage = @"index.html";
|
||||
self.viewController.view.frame = viewBounds;
|
||||
|
||||
// over-ride delegates
|
||||
self.viewController.webView.delegate = self;
|
||||
self.viewController.commandDelegate = self;
|
||||
|
||||
// check whether the current orientation is supported: if it is, keep it, rather than forcing a rotation
|
||||
BOOL forceStartupRotation = YES;
|
||||
UIDeviceOrientation curDevOrientation = [[UIDevice currentDevice] orientation];
|
||||
|
||||
if (UIDeviceOrientationUnknown == curDevOrientation) {
|
||||
// UIDevice isn't firing orientation notifications yet… go look at the status bar
|
||||
curDevOrientation = (UIDeviceOrientation)[[UIApplication sharedApplication] statusBarOrientation];
|
||||
}
|
||||
|
||||
if (UIDeviceOrientationIsValidInterfaceOrientation(curDevOrientation)) {
|
||||
for (NSNumber *orient in self.viewController.supportedOrientations) {
|
||||
if ([orient intValue] == curDevOrientation) {
|
||||
forceStartupRotation = NO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (forceStartupRotation) {
|
||||
NSLog(@"supportedOrientations: %@", self.viewController.supportedOrientations);
|
||||
// The first item in the supportedOrientations array is the start orientation (guaranteed to be at least Portrait)
|
||||
UIInterfaceOrientation newOrient = [[self.viewController.supportedOrientations objectAtIndex:0] intValue];
|
||||
NSLog(@"AppDelegate forcing status bar to: %d from: %d", newOrient, curDevOrientation);
|
||||
[[UIApplication sharedApplication] setStatusBarOrientation:newOrient];
|
||||
}
|
||||
|
||||
[self.window addSubview:self.viewController.view];
|
||||
[self.window makeKeyAndVisible];
|
||||
|
||||
|
||||
NSString *path = @"./cache";
|
||||
NSUInteger discCapacity = 1*1024*1024;
|
||||
NSUInteger memoryCapacity = 0*1024*1024;
|
||||
|
||||
WebViewCache *cache =
|
||||
[[WebViewCache alloc] initWithMemoryCapacity: memoryCapacity
|
||||
diskCapacity: discCapacity diskPath:path];
|
||||
[NSURLCache setSharedURLCache:cache];
|
||||
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
// this happens while we are running ( in the background, or from within our own app )
|
||||
// only valid if FooBar.plist specifies a protocol to handle
|
||||
- (BOOL) application:(UIApplication*)application handleOpenURL:(NSURL*)url
|
||||
{
|
||||
if (!url) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
// calls into javascript global function 'handleOpenURL'
|
||||
NSString* jsString = [NSString stringWithFormat:@"handleOpenURL(\"%@\");", url];
|
||||
[self.viewController.webView stringByEvaluatingJavaScriptFromString:jsString];
|
||||
|
||||
// all plugins will get the notification, and their handlers will be called
|
||||
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:PGPluginHandleOpenURLNotification object:url]];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
#pragma PGCommandDelegate implementation
|
||||
|
||||
- (id) getCommandInstance:(NSString*)className
|
||||
{
|
||||
return [self.viewController getCommandInstance:className];
|
||||
}
|
||||
|
||||
- (BOOL) execute:(InvokedUrlCommand*)command
|
||||
{
|
||||
return [self.viewController execute:command];
|
||||
}
|
||||
|
||||
- (NSString*) pathForResource:(NSString*)resourcepath;
|
||||
{
|
||||
return [self.viewController pathForResource:resourcepath];
|
||||
}
|
||||
|
||||
#pragma UIWebDelegate implementation
|
||||
|
||||
- (void) webViewDidFinishLoad:(UIWebView*) theWebView
|
||||
{
|
||||
// only valid if FooBar.plist specifies a protocol to handle
|
||||
if (self.invokeString)
|
||||
{
|
||||
// this is passed before the deviceready event is fired, so you can access it in js when you receive deviceready
|
||||
NSString* jsString = [NSString stringWithFormat:@"var invokeString = \"%@\";", self.invokeString];
|
||||
[theWebView stringByEvaluatingJavaScriptFromString:jsString];
|
||||
}
|
||||
|
||||
// Black base color for background matches the native apps
|
||||
theWebView.backgroundColor = [UIColor blackColor];
|
||||
|
||||
return [self.viewController webViewDidFinishLoad:theWebView];
|
||||
}
|
||||
|
||||
- (void) webViewDidStartLoad:(UIWebView*)theWebView
|
||||
{
|
||||
return [self.viewController webViewDidStartLoad:theWebView];
|
||||
}
|
||||
|
||||
- (void) webView:(UIWebView*)theWebView didFailLoadWithError:(NSError*)error
|
||||
{
|
||||
return [self.viewController webView:theWebView didFailLoadWithError:error];
|
||||
}
|
||||
|
||||
- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
|
||||
{
|
||||
return [self.viewController webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,17 +0,0 @@
|
||||
//
|
||||
// MainViewController.h
|
||||
// FooBar
|
||||
//
|
||||
// Created by Shazron Abdullah on 12-01-26.
|
||||
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#ifdef PHONEGAP_FRAMEWORK
|
||||
#import <PhoneGap/PGViewController.h>
|
||||
#else
|
||||
#import "PGViewController.h"
|
||||
#endif
|
||||
|
||||
@interface MainViewController : PGViewController
|
||||
|
||||
@end
|
||||
@@ -1,47 +0,0 @@
|
||||
//
|
||||
// MainViewController.m
|
||||
// WebODF
|
||||
//
|
||||
#import "MainViewController.h"
|
||||
|
||||
@implementation MainViewController
|
||||
|
||||
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
|
||||
{
|
||||
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
||||
if (self) {
|
||||
// Custom initialization
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)didReceiveMemoryWarning
|
||||
{
|
||||
// Releases the view if it doesn't have a superview.
|
||||
[super didReceiveMemoryWarning];
|
||||
|
||||
// Release any cached data, images, etc that aren't in use.
|
||||
}
|
||||
|
||||
#pragma mark - View lifecycle
|
||||
|
||||
- (void)viewDidLoad
|
||||
{
|
||||
[super viewDidLoad];
|
||||
// Do any additional setup after loading the view from its nib.
|
||||
}
|
||||
|
||||
- (void)viewDidUnload
|
||||
{
|
||||
[super viewDidUnload];
|
||||
// Release any retained subviews of the main view.
|
||||
// e.g. self.myOutlet = nil;
|
||||
}
|
||||
|
||||
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
|
||||
{
|
||||
// Return YES for supported orientations
|
||||
return (interfaceOrientation == UIInterfaceOrientationPortrait);
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,118 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
|
||||
<data>
|
||||
<int key="IBDocument.SystemTarget">1280</int>
|
||||
<string key="IBDocument.SystemVersion">11C25</string>
|
||||
<string key="IBDocument.InterfaceBuilderVersion">1919</string>
|
||||
<string key="IBDocument.AppKitVersion">1138.11</string>
|
||||
<string key="IBDocument.HIToolboxVersion">566.00</string>
|
||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
||||
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string key="NS.object.0">916</string>
|
||||
</object>
|
||||
<array key="IBDocument.IntegratedClassDependencies">
|
||||
<string>IBProxyObject</string>
|
||||
<string>IBUIView</string>
|
||||
</array>
|
||||
<array key="IBDocument.PluginDependencies">
|
||||
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
</array>
|
||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
||||
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
|
||||
<integer value="1" key="NS.object.0"/>
|
||||
</object>
|
||||
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
||||
<object class="IBProxyObject" id="372490531">
|
||||
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
|
||||
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
||||
</object>
|
||||
<object class="IBProxyObject" id="975951072">
|
||||
<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
|
||||
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
||||
</object>
|
||||
<object class="IBUIView" id="191373211">
|
||||
<reference key="NSNextResponder"/>
|
||||
<int key="NSvFlags">274</int>
|
||||
<string key="NSFrame">{{0, 20}, {320, 460}}</string>
|
||||
<reference key="NSSuperview"/>
|
||||
<reference key="NSWindow"/>
|
||||
<object class="NSColor" key="IBUIBackgroundColor">
|
||||
<int key="NSColorSpace">3</int>
|
||||
<bytes key="NSWhite">MQA</bytes>
|
||||
<object class="NSColorSpace" key="NSCustomColorSpace">
|
||||
<int key="NSID">2</int>
|
||||
</object>
|
||||
</object>
|
||||
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
|
||||
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||
<array class="NSMutableArray" key="connectionRecords">
|
||||
<object class="IBConnectionRecord">
|
||||
<object class="IBCocoaTouchOutletConnection" key="connection">
|
||||
<string key="label">view</string>
|
||||
<reference key="source" ref="372490531"/>
|
||||
<reference key="destination" ref="191373211"/>
|
||||
</object>
|
||||
<int key="connectionID">3</int>
|
||||
</object>
|
||||
</array>
|
||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
||||
<array key="orderedObjects">
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">0</int>
|
||||
<array key="object" id="0"/>
|
||||
<reference key="children" ref="1000"/>
|
||||
<nil key="parent"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">1</int>
|
||||
<reference key="object" ref="191373211"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-1</int>
|
||||
<reference key="object" ref="372490531"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
<string key="objectName">File's Owner</string>
|
||||
</object>
|
||||
<object class="IBObjectRecord">
|
||||
<int key="objectID">-2</int>
|
||||
<reference key="object" ref="975951072"/>
|
||||
<reference key="parent" ref="0"/>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
||||
<string key="-1.CustomClassName">MainViewController</string>
|
||||
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string key="-2.CustomClassName">UIResponder</string>
|
||||
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
<string key="1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
|
||||
</dictionary>
|
||||
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
||||
<nil key="activeLocalization"/>
|
||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||
<nil key="sourceID"/>
|
||||
<int key="maxID">3</int>
|
||||
</object>
|
||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||
<object class="IBPartialClassDescription">
|
||||
<string key="className">MainViewController</string>
|
||||
<string key="superclassName">UIViewController</string>
|
||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||
<string key="majorKey">IBProjectSource</string>
|
||||
<string key="minorKey">./Classes/MainViewController.h</string>
|
||||
</object>
|
||||
</object>
|
||||
</array>
|
||||
</object>
|
||||
<int key="IBDocument.localizationMode">0</int>
|
||||
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
|
||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
||||
<string key="IBCocoaTouchPluginVersion">916</string>
|
||||
</data>
|
||||
</archive>
|
||||
@@ -1,33 +0,0 @@
|
||||
//
|
||||
// NSData+Base64.h
|
||||
// base64
|
||||
//
|
||||
// Created by Matt Gallagher on 2009/06/03.
|
||||
// Copyright 2009 Matt Gallagher. All rights reserved.
|
||||
//
|
||||
// Permission is given to use this source code file, free of charge, in any
|
||||
// project, commercial or otherwise, entirely at your risk, with the condition
|
||||
// that any redistribution (in part or whole) of source code must retain
|
||||
// this copyright and permission notice. Attribution in compiled projects is
|
||||
// appreciated but not required.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
void *NewBase64Decode(
|
||||
const char *inputBuffer,
|
||||
size_t length,
|
||||
size_t *outputLength);
|
||||
|
||||
char *NewBase64Encode(
|
||||
const void *inputBuffer,
|
||||
size_t length,
|
||||
bool separateLines,
|
||||
size_t *outputLength);
|
||||
|
||||
@interface NSData (Base64)
|
||||
|
||||
+ (NSData *)dataFromBase64String:(NSString *)aString;
|
||||
- (NSString *)base64EncodedString;
|
||||
|
||||
@end
|
||||
@@ -1,299 +0,0 @@
|
||||
//
|
||||
// NSData+Base64.m
|
||||
// base64
|
||||
//
|
||||
// Created by Matt Gallagher on 2009/06/03.
|
||||
// Copyright 2009 Matt Gallagher. All rights reserved.
|
||||
//
|
||||
// Permission is given to use this source code file, free of charge, in any
|
||||
// project, commercial or otherwise, entirely at your risk, with the condition
|
||||
// that any redistribution (in part or whole) of source code must retain
|
||||
// this copyright and permission notice. Attribution in compiled projects is
|
||||
// appreciated but not required.
|
||||
//
|
||||
|
||||
#import "NSData+Base64.h"
|
||||
|
||||
//
|
||||
// Mapping from 6 bit pattern to ASCII character.
|
||||
//
|
||||
static unsigned char base64EncodeLookup[65] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
//
|
||||
// Definition for "masked-out" areas of the base64DecodeLookup mapping
|
||||
//
|
||||
#define xx 65
|
||||
|
||||
//
|
||||
// Mapping from ASCII character to 6 bit pattern.
|
||||
//
|
||||
static unsigned char base64DecodeLookup[256] =
|
||||
{
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, xx, 63,
|
||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx,
|
||||
xx, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, xx,
|
||||
xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
};
|
||||
|
||||
//
|
||||
// Fundamental sizes of the binary and base64 encode/decode units in bytes
|
||||
//
|
||||
#define BINARY_UNIT_SIZE 3
|
||||
#define BASE64_UNIT_SIZE 4
|
||||
|
||||
//
|
||||
// NewBase64Decode
|
||||
//
|
||||
// Decodes the base64 ASCII string in the inputBuffer to a newly malloced
|
||||
// output buffer.
|
||||
//
|
||||
// inputBuffer - the source ASCII string for the decode
|
||||
// length - the length of the string or -1 (to specify strlen should be used)
|
||||
// outputLength - if not-NULL, on output will contain the decoded length
|
||||
//
|
||||
// returns the decoded buffer. Must be free'd by caller. Length is given by
|
||||
// outputLength.
|
||||
//
|
||||
void *NewBase64Decode(
|
||||
const char *inputBuffer,
|
||||
size_t length,
|
||||
size_t *outputLength)
|
||||
{
|
||||
if (length == -1)
|
||||
{
|
||||
length = strlen(inputBuffer);
|
||||
}
|
||||
|
||||
size_t outputBufferSize = (length / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE;
|
||||
unsigned char *outputBuffer = (unsigned char *)malloc(outputBufferSize);
|
||||
|
||||
size_t i = 0;
|
||||
size_t j = 0;
|
||||
while (i < length)
|
||||
{
|
||||
//
|
||||
// Accumulate 4 valid characters (ignore everything else)
|
||||
//
|
||||
unsigned char accumulated[BASE64_UNIT_SIZE];
|
||||
bzero(accumulated, sizeof(unsigned char) * BASE64_UNIT_SIZE);
|
||||
size_t accumulateIndex = 0;
|
||||
while (i < length)
|
||||
{
|
||||
unsigned char decode = base64DecodeLookup[inputBuffer[i++]];
|
||||
if (decode != xx)
|
||||
{
|
||||
accumulated[accumulateIndex] = decode;
|
||||
accumulateIndex++;
|
||||
|
||||
if (accumulateIndex == BASE64_UNIT_SIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Store the 6 bits from each of the 4 characters as 3 bytes
|
||||
//
|
||||
outputBuffer[j] = (accumulated[0] << 2) | (accumulated[1] >> 4);
|
||||
outputBuffer[j + 1] = (accumulated[1] << 4) | (accumulated[2] >> 2);
|
||||
outputBuffer[j + 2] = (accumulated[2] << 6) | accumulated[3];
|
||||
j += accumulateIndex - 1;
|
||||
}
|
||||
|
||||
if (outputLength)
|
||||
{
|
||||
*outputLength = j;
|
||||
}
|
||||
return outputBuffer;
|
||||
}
|
||||
|
||||
//
|
||||
// NewBase64Decode
|
||||
//
|
||||
// Encodes the arbitrary data in the inputBuffer as base64 into a newly malloced
|
||||
// output buffer.
|
||||
//
|
||||
// inputBuffer - the source data for the encode
|
||||
// length - the length of the input in bytes
|
||||
// separateLines - if zero, no CR/LF characters will be added. Otherwise
|
||||
// a CR/LF pair will be added every 64 encoded chars.
|
||||
// outputLength - if not-NULL, on output will contain the encoded length
|
||||
// (not including terminating 0 char)
|
||||
//
|
||||
// returns the encoded buffer. Must be free'd by caller. Length is given by
|
||||
// outputLength.
|
||||
//
|
||||
char *NewBase64Encode(
|
||||
const void *buffer,
|
||||
size_t length,
|
||||
bool separateLines,
|
||||
size_t *outputLength)
|
||||
{
|
||||
const unsigned char *inputBuffer = (const unsigned char *)buffer;
|
||||
|
||||
#define MAX_NUM_PADDING_CHARS 2
|
||||
#define OUTPUT_LINE_LENGTH 64
|
||||
#define INPUT_LINE_LENGTH ((OUTPUT_LINE_LENGTH / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE)
|
||||
#define CR_LF_SIZE 0
|
||||
|
||||
//
|
||||
// Byte accurate calculation of final buffer size
|
||||
//
|
||||
size_t outputBufferSize =
|
||||
((length / BINARY_UNIT_SIZE)
|
||||
+ ((length % BINARY_UNIT_SIZE) ? 1 : 0))
|
||||
* BASE64_UNIT_SIZE;
|
||||
if (separateLines)
|
||||
{
|
||||
outputBufferSize +=
|
||||
(outputBufferSize / OUTPUT_LINE_LENGTH) * CR_LF_SIZE;
|
||||
}
|
||||
|
||||
//
|
||||
// Include space for a terminating zero
|
||||
//
|
||||
outputBufferSize += 1;
|
||||
|
||||
//
|
||||
// Allocate the output buffer
|
||||
//
|
||||
char *outputBuffer = (char *)malloc(outputBufferSize);
|
||||
if (!outputBuffer)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t i = 0;
|
||||
size_t j = 0;
|
||||
const size_t lineLength = separateLines ? INPUT_LINE_LENGTH : length;
|
||||
size_t lineEnd = lineLength;
|
||||
|
||||
while (true)
|
||||
{
|
||||
if (lineEnd > length)
|
||||
{
|
||||
lineEnd = length;
|
||||
}
|
||||
|
||||
for (; i + BINARY_UNIT_SIZE - 1 < lineEnd; i += BINARY_UNIT_SIZE)
|
||||
{
|
||||
//
|
||||
// Inner loop: turn 48 bytes into 64 base64 characters
|
||||
//
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
|
||||
outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4)
|
||||
| ((inputBuffer[i + 1] & 0xF0) >> 4)];
|
||||
outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i + 1] & 0x0F) << 2)
|
||||
| ((inputBuffer[i + 2] & 0xC0) >> 6)];
|
||||
outputBuffer[j++] = base64EncodeLookup[inputBuffer[i + 2] & 0x3F];
|
||||
}
|
||||
|
||||
if (lineEnd == length)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Add the newline
|
||||
//
|
||||
//outputBuffer[j++] = '\r';
|
||||
//outputBuffer[j++] = '\n';
|
||||
lineEnd += lineLength;
|
||||
}
|
||||
|
||||
if (i + 1 < length)
|
||||
{
|
||||
//
|
||||
// Handle the single '=' case
|
||||
//
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
|
||||
outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4)
|
||||
| ((inputBuffer[i + 1] & 0xF0) >> 4)];
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i + 1] & 0x0F) << 2];
|
||||
outputBuffer[j++] = '=';
|
||||
}
|
||||
else if (i < length)
|
||||
{
|
||||
//
|
||||
// Handle the double '=' case
|
||||
//
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0x03) << 4];
|
||||
outputBuffer[j++] = '=';
|
||||
outputBuffer[j++] = '=';
|
||||
}
|
||||
outputBuffer[j] = 0;
|
||||
|
||||
//
|
||||
// Set the output length and return the buffer
|
||||
//
|
||||
if (outputLength)
|
||||
{
|
||||
*outputLength = j;
|
||||
}
|
||||
return outputBuffer;
|
||||
}
|
||||
|
||||
@implementation NSData (Base64)
|
||||
|
||||
//
|
||||
// dataFromBase64String:
|
||||
//
|
||||
// Creates an NSData object containing the base64 decoded representation of
|
||||
// the base64 string 'aString'
|
||||
//
|
||||
// Parameters:
|
||||
// aString - the base64 string to decode
|
||||
//
|
||||
// returns the autoreleased NSData representation of the base64 string
|
||||
//
|
||||
+ (NSData *)dataFromBase64String:(NSString *)aString
|
||||
{
|
||||
NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding];
|
||||
size_t outputLength;
|
||||
void *outputBuffer = NewBase64Decode([data bytes], [data length], &outputLength);
|
||||
NSData *result = [NSData dataWithBytes:outputBuffer length:outputLength];
|
||||
free(outputBuffer);
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// base64EncodedString
|
||||
//
|
||||
// Creates an NSString object that contains the base 64 encoding of the
|
||||
// receiver's data. Lines are broken at 64 characters long.
|
||||
//
|
||||
// returns an autoreleased NSString being the base 64 representation of the
|
||||
// receiver.
|
||||
//
|
||||
- (NSString *)base64EncodedString
|
||||
{
|
||||
size_t outputLength;
|
||||
char *outputBuffer =
|
||||
NewBase64Encode([self bytes], [self length], true, &outputLength);
|
||||
|
||||
NSString *result =
|
||||
[[[NSString alloc]
|
||||
initWithBytes:outputBuffer
|
||||
length:outputLength
|
||||
encoding:NSASCIIStringEncoding]
|
||||
autorelease];
|
||||
free(outputBuffer);
|
||||
return result;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,13 +0,0 @@
|
||||
#import <PhoneGap/PGPlugin.h>
|
||||
|
||||
@interface NativeZip : PGPlugin {
|
||||
NSString* callbackID;
|
||||
}
|
||||
|
||||
@property (nonatomic, copy) NSString* callbackID;
|
||||
|
||||
- (void) load:(BOOL)base64 arguments:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
|
||||
- (void) loadAsString:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
|
||||
- (void) loadAsDataURL:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
|
||||
|
||||
@end
|
||||
@@ -1,79 +0,0 @@
|
||||
#import "NativeZip.h"
|
||||
#import "minizip/unzip.h"
|
||||
#import "NSData+Base64.h"
|
||||
|
||||
@implementation NativeZip
|
||||
@synthesize callbackID;
|
||||
|
||||
-(void) load:(BOOL)base64 arguments:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
|
||||
{
|
||||
self.callbackID = [arguments objectAtIndex:0];
|
||||
NSString *zipPath = [arguments objectAtIndex:1];
|
||||
NSString *entryPath = [arguments objectAtIndex:2];
|
||||
NSString *mimetype = nil;
|
||||
if (base64 == TRUE) {
|
||||
mimetype = [arguments objectAtIndex:3];
|
||||
}
|
||||
|
||||
const char* path = [ zipPath cStringUsingEncoding:NSUTF8StringEncoding ];
|
||||
unzFile unzipFile = unzOpen(path);
|
||||
NSString* jsString = nil;
|
||||
BOOL error = TRUE;
|
||||
if (!unzipFile) {
|
||||
jsString = [[NSString alloc] initWithString: @"cannot open file"];
|
||||
} else {
|
||||
path = [ entryPath cStringUsingEncoding:NSUTF8StringEncoding ];
|
||||
int r = unzLocateFile(unzipFile, path, 2);
|
||||
if (r != UNZ_OK) {
|
||||
jsString = [[NSString alloc] initWithString: @"cannot find entry"];
|
||||
} else {
|
||||
unz_file_info info;
|
||||
r = unzGetCurrentFileInfo(unzipFile, &info, 0, 0, 0, 0, 0, 0);
|
||||
if (r != UNZ_OK) {
|
||||
jsString = [[NSString alloc] initWithString: @"cannot determine size"];
|
||||
} else {
|
||||
r = unzOpenCurrentFile(unzipFile);
|
||||
if (r != UNZ_OK) {
|
||||
jsString = [[NSString alloc] initWithString: @"cannot open entry"];
|
||||
} else {
|
||||
char* contents = malloc(info.uncompressed_size);
|
||||
r = unzReadCurrentFile(unzipFile, contents, info.uncompressed_size);
|
||||
if (r != info.uncompressed_size) {
|
||||
jsString = [[NSString alloc] initWithString: @"cannot uncompress file"];
|
||||
} else {
|
||||
if (base64) {
|
||||
NSData* readData = [NSData dataWithBytes:(const void *)contents length:sizeof(unsigned char)*info.uncompressed_size];
|
||||
jsString = [NSString stringWithFormat:@"data:%@;base64,%@", mimetype, [readData base64EncodedString]];
|
||||
} else {
|
||||
jsString = [[NSString alloc] initWithUTF8String: contents];
|
||||
}
|
||||
}
|
||||
unzCloseCurrentFile(unzipFile);
|
||||
free(contents);
|
||||
error = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
unzClose(unzipFile);
|
||||
}
|
||||
PluginResult* pluginResult = [PluginResult
|
||||
resultWithStatus:PGCommandStatus_OK
|
||||
messageAsString: jsString
|
||||
];
|
||||
if (!error) {
|
||||
[self writeJavascript: [pluginResult toSuccessCallbackString:self.callbackID]];
|
||||
} else {
|
||||
[self writeJavascript: [pluginResult toErrorCallbackString:self.callbackID]];
|
||||
}
|
||||
}
|
||||
|
||||
-(void)loadAsString:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
|
||||
{
|
||||
[self load:FALSE arguments:arguments withDict:options];
|
||||
}
|
||||
-(void)loadAsDataURL:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
|
||||
{
|
||||
[self load:TRUE arguments:arguments withDict:options];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,15 +0,0 @@
|
||||
//
|
||||
// WebCache.h
|
||||
// KO Viewer
|
||||
//
|
||||
// Created by Tobias Hintze on 3/5/12.
|
||||
// Copyright (c) 2012 KO GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface WebViewCache : NSURLCache
|
||||
|
||||
- (NSData*)getSomeData:(NSString*)zip entry:(NSString*)entry;
|
||||
|
||||
@end
|
||||
@@ -1,72 +0,0 @@
|
||||
//
|
||||
// WebCache.m
|
||||
// KO Viewer
|
||||
//
|
||||
// Created by Tobias Hintze on 3/5/12.
|
||||
// Copyright (c) 2012 KO GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "WebViewCache.h"
|
||||
#import "minizip/unzip.h"
|
||||
|
||||
@implementation WebViewCache
|
||||
|
||||
- (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request
|
||||
{
|
||||
[super removeAllCachedResponses];
|
||||
NSURL *url = [request URL];
|
||||
if ([url query]) {
|
||||
NSData *somedata = [self getSomeData:[url path] entry:[url query]];
|
||||
NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:url
|
||||
MIMEType:@"text/xml"
|
||||
expectedContentLength:[somedata length]
|
||||
textEncodingName:nil];
|
||||
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc]
|
||||
initWithResponse:response data:somedata];
|
||||
return cachedResponse;
|
||||
}
|
||||
return [super cachedResponseForRequest:request];
|
||||
}
|
||||
|
||||
- (NSData*)getSomeData:(NSString*)zip entry:(NSString*)entry
|
||||
{
|
||||
NSLog(@"get some data: %@ %@", zip, entry);
|
||||
const char* path = [ zip cStringUsingEncoding:NSUTF8StringEncoding ];
|
||||
unzFile unzipFile = unzOpen(path);
|
||||
NSData *data = nil;
|
||||
if (!unzipFile) {
|
||||
NSLog(@"cannot open file %@", zip);
|
||||
} else {
|
||||
path = [ entry cStringUsingEncoding:NSUTF8StringEncoding ];
|
||||
int r = unzLocateFile(unzipFile, path, 2);
|
||||
if (r != UNZ_OK) {
|
||||
NSLog(@"cannot find entry %@", entry);
|
||||
} else {
|
||||
unz_file_info info;
|
||||
r = unzGetCurrentFileInfo(unzipFile, &info, 0, 0, 0, 0, 0, 0);
|
||||
if (r != UNZ_OK) {
|
||||
NSLog(@"cannot determine size of %@", entry);
|
||||
} else {
|
||||
r = unzOpenCurrentFile(unzipFile);
|
||||
if (r != UNZ_OK) {
|
||||
NSLog(@"cannot open entry %@", entry);
|
||||
} else {
|
||||
char* contents = malloc(info.uncompressed_size);
|
||||
r = unzReadCurrentFile(unzipFile, contents, info.uncompressed_size);
|
||||
if (r != info.uncompressed_size) {
|
||||
NSLog(@"cannot uncompress file %@", entry);
|
||||
} else {
|
||||
data = [NSData dataWithBytes:(const void *)contents length:sizeof(unsigned char)*info.uncompressed_size];
|
||||
NSLog(@"read file entry %li %@", info.uncompressed_size, entry);
|
||||
}
|
||||
unzCloseCurrentFile(unzipFile);
|
||||
free(contents);
|
||||
}
|
||||
}
|
||||
}
|
||||
unzClose(unzipFile);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,132 +0,0 @@
|
||||
/* crypt.h -- base code for crypt/uncrypt ZIPfile
|
||||
|
||||
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
|
||||
This code is a modified version of crypting code in Infozip distribution
|
||||
|
||||
The encryption/decryption parts of this source code (as opposed to the
|
||||
non-echoing password parts) were originally written in Europe. The
|
||||
whole source package can be freely distributed, including from the USA.
|
||||
(Prior to January 2000, re-export from the US was a violation of US law.)
|
||||
|
||||
This encryption code is a direct transcription of the algorithm from
|
||||
Roger Schlafly, described by Phil Katz in the file appnote.txt. This
|
||||
file (appnote.txt) is distributed with the PKZIP program (even in the
|
||||
version without encryption capabilities).
|
||||
|
||||
If you don't need crypting in your application, just define symbols
|
||||
NOCRYPT and NOUNCRYPT.
|
||||
|
||||
This code support the "Traditional PKWARE Encryption".
|
||||
|
||||
The new AES encryption added on Zip format by Winzip (see the page
|
||||
http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
|
||||
Encryption is not supported.
|
||||
*/
|
||||
|
||||
#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
|
||||
|
||||
/***********************************************************************
|
||||
* Return the next byte in the pseudo-random sequence
|
||||
*/
|
||||
static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
|
||||
{
|
||||
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
|
||||
* unpredictable manner on 16-bit systems; not a problem
|
||||
* with any known compiler so far, though */
|
||||
|
||||
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
|
||||
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* Update the encryption keys with the next byte of plain text
|
||||
*/
|
||||
static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
|
||||
{
|
||||
(*(pkeys+0)) = CRC32((*(pkeys+0)), c);
|
||||
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
|
||||
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
|
||||
{
|
||||
register int keyshift = (int)((*(pkeys+1)) >> 24);
|
||||
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Initialize the encryption keys and the random header according to
|
||||
* the given password.
|
||||
*/
|
||||
static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
|
||||
{
|
||||
*(pkeys+0) = 305419896L;
|
||||
*(pkeys+1) = 591751049L;
|
||||
*(pkeys+2) = 878082192L;
|
||||
while (*passwd != '\0') {
|
||||
update_keys(pkeys,pcrc_32_tab,(int)*passwd);
|
||||
passwd++;
|
||||
}
|
||||
}
|
||||
|
||||
#define zdecode(pkeys,pcrc_32_tab,c) \
|
||||
(update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
|
||||
|
||||
#define zencode(pkeys,pcrc_32_tab,c,t) \
|
||||
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
|
||||
|
||||
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
|
||||
|
||||
#define RAND_HEAD_LEN 12
|
||||
/* "last resort" source for second part of crypt seed pattern */
|
||||
# ifndef ZCR_SEED2
|
||||
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
|
||||
# endif
|
||||
|
||||
static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting)
|
||||
const char *passwd; /* password string */
|
||||
unsigned char *buf; /* where to write header */
|
||||
int bufSize;
|
||||
unsigned long* pkeys;
|
||||
const unsigned long* pcrc_32_tab;
|
||||
unsigned long crcForCrypting;
|
||||
{
|
||||
int n; /* index in random header */
|
||||
int t; /* temporary */
|
||||
int c; /* random byte */
|
||||
unsigned char header[RAND_HEAD_LEN-2]; /* random header */
|
||||
static unsigned calls = 0; /* ensure different random header each time */
|
||||
|
||||
if (bufSize<RAND_HEAD_LEN)
|
||||
return 0;
|
||||
|
||||
/* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
|
||||
* output of rand() to get less predictability, since rand() is
|
||||
* often poorly implemented.
|
||||
*/
|
||||
if (++calls == 1)
|
||||
{
|
||||
srand((unsigned)(time(NULL) ^ ZCR_SEED2));
|
||||
}
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
for (n = 0; n < RAND_HEAD_LEN-2; n++)
|
||||
{
|
||||
c = (rand() >> 7) & 0xff;
|
||||
header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
|
||||
}
|
||||
/* Encrypt random header (last two bytes is high word of crc) */
|
||||
init_keys(passwd, pkeys, pcrc_32_tab);
|
||||
for (n = 0; n < RAND_HEAD_LEN-2; n++)
|
||||
{
|
||||
buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
|
||||
}
|
||||
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
|
||||
buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
|
||||
return n;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,177 +0,0 @@
|
||||
/* ioapi.c -- IO base function header for compress/uncompress .zip
|
||||
files using zlib + zip or unzip API
|
||||
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "zlib.h"
|
||||
#include "ioapi.h"
|
||||
|
||||
|
||||
|
||||
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
|
||||
|
||||
#ifndef SEEK_CUR
|
||||
#define SEEK_CUR 1
|
||||
#endif
|
||||
|
||||
#ifndef SEEK_END
|
||||
#define SEEK_END 2
|
||||
#endif
|
||||
|
||||
#ifndef SEEK_SET
|
||||
#define SEEK_SET 0
|
||||
#endif
|
||||
|
||||
voidpf ZCALLBACK fopen_file_func OF((
|
||||
voidpf opaque,
|
||||
const char* filename,
|
||||
int mode));
|
||||
|
||||
uLong ZCALLBACK fread_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream,
|
||||
void* buf,
|
||||
uLong size));
|
||||
|
||||
uLong ZCALLBACK fwrite_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream,
|
||||
const void* buf,
|
||||
uLong size));
|
||||
|
||||
long ZCALLBACK ftell_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream));
|
||||
|
||||
long ZCALLBACK fseek_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream,
|
||||
uLong offset,
|
||||
int origin));
|
||||
|
||||
int ZCALLBACK fclose_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream));
|
||||
|
||||
int ZCALLBACK ferror_file_func OF((
|
||||
voidpf opaque,
|
||||
voidpf stream));
|
||||
|
||||
|
||||
voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
|
||||
voidpf opaque;
|
||||
const char* filename;
|
||||
int mode;
|
||||
{
|
||||
FILE* file = NULL;
|
||||
const char* mode_fopen = NULL;
|
||||
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
|
||||
mode_fopen = "rb";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
||||
mode_fopen = "r+b";
|
||||
else
|
||||
if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
||||
mode_fopen = "wb";
|
||||
|
||||
if ((filename!=NULL) && (mode_fopen != NULL))
|
||||
file = fopen(filename, mode_fopen);
|
||||
return file;
|
||||
}
|
||||
|
||||
|
||||
uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
void* buf;
|
||||
uLong size;
|
||||
{
|
||||
uLong ret;
|
||||
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
const void* buf;
|
||||
uLong size;
|
||||
{
|
||||
uLong ret;
|
||||
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
long ZCALLBACK ftell_file_func (opaque, stream)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
{
|
||||
long ret;
|
||||
ret = ftell((FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
uLong offset;
|
||||
int origin;
|
||||
{
|
||||
int fseek_origin=0;
|
||||
long ret;
|
||||
switch (origin)
|
||||
{
|
||||
case ZLIB_FILEFUNC_SEEK_CUR :
|
||||
fseek_origin = SEEK_CUR;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_END :
|
||||
fseek_origin = SEEK_END;
|
||||
break;
|
||||
case ZLIB_FILEFUNC_SEEK_SET :
|
||||
fseek_origin = SEEK_SET;
|
||||
break;
|
||||
default: return -1;
|
||||
}
|
||||
ret = 0;
|
||||
fseek((FILE *)stream, offset, fseek_origin);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ZCALLBACK fclose_file_func (opaque, stream)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
{
|
||||
int ret;
|
||||
ret = fclose((FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ZCALLBACK ferror_file_func (opaque, stream)
|
||||
voidpf opaque;
|
||||
voidpf stream;
|
||||
{
|
||||
int ret;
|
||||
ret = ferror((FILE *)stream);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void fill_fopen_filefunc (pzlib_filefunc_def)
|
||||
zlib_filefunc_def* pzlib_filefunc_def;
|
||||
{
|
||||
pzlib_filefunc_def->zopen_file = fopen_file_func;
|
||||
pzlib_filefunc_def->zread_file = fread_file_func;
|
||||
pzlib_filefunc_def->zwrite_file = fwrite_file_func;
|
||||
pzlib_filefunc_def->ztell_file = ftell_file_func;
|
||||
pzlib_filefunc_def->zseek_file = fseek_file_func;
|
||||
pzlib_filefunc_def->zclose_file = fclose_file_func;
|
||||
pzlib_filefunc_def->zerror_file = ferror_file_func;
|
||||
pzlib_filefunc_def->opaque = NULL;
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
/* ioapi.h -- IO base function header for compress/uncompress .zip
|
||||
files using zlib + zip or unzip API
|
||||
|
||||
Version 1.01e, February 12th, 2005
|
||||
|
||||
Copyright (C) 1998-2005 Gilles Vollant
|
||||
*/
|
||||
|
||||
#ifndef _ZLIBIOAPI_H
|
||||
#define _ZLIBIOAPI_H
|
||||
|
||||
|
||||
#define ZLIB_FILEFUNC_SEEK_CUR (1)
|
||||
#define ZLIB_FILEFUNC_SEEK_END (2)
|
||||
#define ZLIB_FILEFUNC_SEEK_SET (0)
|
||||
|
||||
#define ZLIB_FILEFUNC_MODE_READ (1)
|
||||
#define ZLIB_FILEFUNC_MODE_WRITE (2)
|
||||
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
|
||||
|
||||
#define ZLIB_FILEFUNC_MODE_EXISTING (4)
|
||||
#define ZLIB_FILEFUNC_MODE_CREATE (8)
|
||||
|
||||
|
||||
#ifndef ZCALLBACK
|
||||
|
||||
#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
|
||||
#define ZCALLBACK CALLBACK
|
||||
#else
|
||||
#define ZCALLBACK
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
|
||||
typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
|
||||
typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
|
||||
typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
|
||||
typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
|
||||
typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
|
||||
|
||||
typedef struct zlib_filefunc_def_s
|
||||
{
|
||||
open_file_func zopen_file;
|
||||
read_file_func zread_file;
|
||||
write_file_func zwrite_file;
|
||||
tell_file_func ztell_file;
|
||||
seek_file_func zseek_file;
|
||||
close_file_func zclose_file;
|
||||
testerror_file_func zerror_file;
|
||||
voidpf opaque;
|
||||
} zlib_filefunc_def;
|
||||
|
||||
|
||||
|
||||
void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
|
||||
|
||||
#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
|
||||
#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
|
||||
#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
|
||||
#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
|
||||
#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
|
||||
#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||