Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
douban-api-proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
captainwong
douban-api-proxy
Commits
26e45f1f
Commit
26e45f1f
authored
May 31, 2019
by
Ozzieisaacs
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'comic-reader/master'
parents
df5d15d1
867aa2f0
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
2304 additions
and
747 deletions
+2304
-747
archive.js
cps/static/js/archive/archive.js
+67
-45
rarvm.js
cps/static/js/archive/rarvm.js
+858
-0
unrar.js
cps/static/js/archive/unrar.js
+580
-112
untar.js
cps/static/js/archive/untar.js
+167
-0
unzip.js
cps/static/js/archive/unzip.js
+103
-62
bytestream.js
cps/static/js/bytestream.js
+0
-308
bitstream.js
cps/static/js/io/bitstream.js
+233
-0
bytebuffer.js
cps/static/js/io/bytebuffer.js
+121
-0
bytestream.js
cps/static/js/io/bytestream.js
+162
-0
kthoom.js
cps/static/js/kthoom.js
+10
-2
untar.js
cps/static/js/untar.js
+0
-209
readcbr.html
cps/templates/readcbr.html
+3
-9
No files found.
cps/static/js/archive.js
→
cps/static/js/archive
/archive
.js
View file @
26e45f1f
...
...
@@ -17,7 +17,7 @@ bitjs.archive = bitjs.archive || {};
// ===========================================================================
// Stolen from Closure because it's the best way to do Java-like inheritance.
bitjs
.
base
=
function
(
me
,
opt
MethodName
,
varA
rgs
)
{
bitjs
.
base
=
function
(
me
,
opt
_methodName
,
var_a
rgs
)
{
var
caller
=
arguments
.
callee
.
caller
;
if
(
caller
.
superClass_
)
{
// This is a constructor. Call the superclass constructor.
...
...
@@ -27,12 +27,11 @@ bitjs.archive = bitjs.archive || {};
var
args
=
Array
.
prototype
.
slice
.
call
(
arguments
,
2
);
var
foundCaller
=
false
;
for
(
var
ctor
=
me
.
constructor
;
ctor
;
ctor
=
ctor
.
superClass_
&&
ctor
.
superClass_
.
constructor
)
{
if
(
ctor
.
prototype
[
optMethodName
]
===
caller
)
{
for
(
var
ctor
=
me
.
constructor
;
ctor
;
ctor
=
ctor
.
superClass_
&&
ctor
.
superClass_
.
constructor
)
{
if
(
ctor
.
prototype
[
opt_methodName
]
===
caller
)
{
foundCaller
=
true
;
}
else
if
(
foundCaller
)
{
return
ctor
.
prototype
[
opt
M
ethodName
].
apply
(
me
,
args
);
return
ctor
.
prototype
[
opt
_m
ethodName
].
apply
(
me
,
args
);
}
}
...
...
@@ -40,8 +39,8 @@ bitjs.archive = bitjs.archive || {};
// then one of two things happened:
// 1) The caller is an instance method.
// 2) This method was not called by the right caller.
if
(
me
[
opt
M
ethodName
]
===
caller
)
{
return
me
.
constructor
.
prototype
[
opt
M
ethodName
].
apply
(
me
,
args
);
if
(
me
[
opt
_m
ethodName
]
===
caller
)
{
return
me
.
constructor
.
prototype
[
opt
_m
ethodName
].
apply
(
me
,
args
);
}
else
{
throw
Error
(
"goog.base called from a method of one name "
+
...
...
@@ -50,10 +49,10 @@ bitjs.archive = bitjs.archive || {};
};
bitjs
.
inherits
=
function
(
childCtor
,
parentCtor
)
{
/** @constructor */
function
TempCtor
()
{}
T
empCtor
.
prototype
=
parentCtor
.
prototype
;
function
tempCtor
()
{};
t
empCtor
.
prototype
=
parentCtor
.
prototype
;
childCtor
.
superClass_
=
parentCtor
.
prototype
;
childCtor
.
prototype
=
new
T
empCtor
();
childCtor
.
prototype
=
new
t
empCtor
();
childCtor
.
prototype
.
constructor
=
childCtor
;
};
// ===========================================================================
...
...
@@ -189,10 +188,10 @@ bitjs.archive = bitjs.archive || {};
* Base class for all Unarchivers.
*
* @param {ArrayBuffer} arrayBuffer The Array Buffer.
* @param {string} opt
P
athToBitJS Optional string for where the BitJS files are located.
* @param {string} opt
_p
athToBitJS Optional string for where the BitJS files are located.
* @constructor
*/
bitjs
.
archive
.
Unarchiver
=
function
(
arrayBuffer
,
opt
P
athToBitJS
)
{
bitjs
.
archive
.
Unarchiver
=
function
(
arrayBuffer
,
opt
_p
athToBitJS
)
{
/**
* The ArrayBuffer object.
* @type {ArrayBuffer}
...
...
@@ -205,7 +204,7 @@ bitjs.archive = bitjs.archive || {};
* @type {string}
* @private
*/
this
.
pathToBitJS_
=
opt
PathToBitJS
||
"
"
;
this
.
pathToBitJS_
=
opt
_pathToBitJS
||
"/
"
;
/**
* A map from event type to an array of listeners.
...
...
@@ -320,8 +319,8 @@ bitjs.archive = bitjs.archive || {};
* @extends {bitjs.archive.Unarchiver}
* @constructor
*/
bitjs
.
archive
.
Unzipper
=
function
(
arrayBuffer
,
opt
P
athToBitJS
)
{
bitjs
.
base
(
this
,
arrayBuffer
,
opt
P
athToBitJS
);
bitjs
.
archive
.
Unzipper
=
function
(
arrayBuffer
,
opt
_p
athToBitJS
)
{
bitjs
.
base
(
this
,
arrayBuffer
,
opt
_p
athToBitJS
);
};
bitjs
.
inherits
(
bitjs
.
archive
.
Unzipper
,
bitjs
.
archive
.
Unarchiver
);
bitjs
.
archive
.
Unzipper
.
prototype
.
getScriptFileName
=
function
()
{
...
...
@@ -333,8 +332,8 @@ bitjs.archive = bitjs.archive || {};
* @extends {bitjs.archive.Unarchiver}
* @constructor
*/
bitjs
.
archive
.
Unrarrer
=
function
(
arrayBuffer
,
opt
P
athToBitJS
)
{
bitjs
.
base
(
this
,
arrayBuffer
,
opt
P
athToBitJS
);
bitjs
.
archive
.
Unrarrer
=
function
(
arrayBuffer
,
opt
_p
athToBitJS
)
{
bitjs
.
base
(
this
,
arrayBuffer
,
opt
_p
athToBitJS
);
};
bitjs
.
inherits
(
bitjs
.
archive
.
Unrarrer
,
bitjs
.
archive
.
Unarchiver
);
bitjs
.
archive
.
Unrarrer
.
prototype
.
getScriptFileName
=
function
()
{
...
...
@@ -346,12 +345,35 @@ bitjs.archive = bitjs.archive || {};
* @extends {bitjs.archive.Unarchiver}
* @constructor
*/
bitjs
.
archive
.
Untarrer
=
function
(
arrayBuffer
,
opt
P
athToBitJS
)
{
bitjs
.
base
(
this
,
arrayBuffer
,
opt
P
athToBitJS
);
bitjs
.
archive
.
Untarrer
=
function
(
arrayBuffer
,
opt
_p
athToBitJS
)
{
bitjs
.
base
(
this
,
arrayBuffer
,
opt
_p
athToBitJS
);
};
bitjs
.
inherits
(
bitjs
.
archive
.
Untarrer
,
bitjs
.
archive
.
Unarchiver
);
bitjs
.
archive
.
Untarrer
.
prototype
.
getScriptFileName
=
function
()
{
return
"untar.js"
;
};
/**
* Factory method that creates an unarchiver based on the byte signature found
* in the arrayBuffer.
* @param {ArrayBuffer} ab
* @param {string=} opt_pathToBitJS Path to the unarchiver script files.
* @return {bitjs.archive.Unarchiver}
*/
bitjs
.
archive
.
GetUnarchiver
=
function
(
ab
,
opt_pathToBitJS
)
{
var
unarchiver
=
null
;
var
pathToBitJS
=
opt_pathToBitJS
||
''
;
var
h
=
new
Uint8Array
(
ab
,
0
,
10
);
if
(
h
[
0
]
==
0x52
&&
h
[
1
]
==
0x61
&&
h
[
2
]
==
0x72
&&
h
[
3
]
==
0x21
)
{
// Rar!
unarchiver
=
new
bitjs
.
archive
.
Unrarrer
(
ab
,
pathToBitJS
);
}
else
if
(
h
[
0
]
==
80
&&
h
[
1
]
==
75
)
{
// PK (Zip)
unarchiver
=
new
bitjs
.
archive
.
Unzipper
(
ab
,
pathToBitJS
);
}
else
{
// Try with tar
console
.
log
(
'geter'
);
unarchiver
=
new
bitjs
.
archive
.
Untarrer
(
ab
,
pathToBitJS
);
}
return
unarchiver
;
};
})();
cps/static/js/archive/rarvm.js
0 → 100644
View file @
26e45f1f
This diff is collapsed.
Click to expand it.
cps/static/js/unrar.js
→
cps/static/js/
archive/
unrar.js
View file @
26e45f1f
This diff is collapsed.
Click to expand it.
cps/static/js/archive/untar.js
0 → 100644
View file @
26e45f1f
/**
* untar.js
*
* Licensed under the MIT License
*
* Copyright(c) 2011 Google Inc.
*
* Reference Documentation:
*
* TAR format: http://www.gnu.org/software/automake/manual/tar/Standard.html
*/
// This file expects to be invoked as a Worker (see onmessage below).
importScripts
(
'../io/bytestream.js'
);
importScripts
(
'archive.js'
);
// Progress variables.
var
currentFilename
=
""
;
var
currentFileNumber
=
0
;
var
currentBytesUnarchivedInFile
=
0
;
var
currentBytesUnarchived
=
0
;
var
totalUncompressedBytesInArchive
=
0
;
var
totalFilesInArchive
=
0
;
// Helper functions.
var
info
=
function
(
str
)
{
postMessage
(
new
bitjs
.
archive
.
UnarchiveInfoEvent
(
str
));
};
var
err
=
function
(
str
)
{
postMessage
(
new
bitjs
.
archive
.
UnarchiveErrorEvent
(
str
));
};
// Removes all characters from the first zero-byte in the string onwards.
var
readCleanString
=
function
(
bstr
,
numBytes
)
{
var
str
=
bstr
.
readString
(
numBytes
);
var
zIndex
=
str
.
indexOf
(
String
.
fromCharCode
(
0
));
return
zIndex
!=
-
1
?
str
.
substr
(
0
,
zIndex
)
:
str
;
};
var
postProgress
=
function
()
{
postMessage
(
new
bitjs
.
archive
.
UnarchiveProgressEvent
(
currentFilename
,
currentFileNumber
,
currentBytesUnarchivedInFile
,
currentBytesUnarchived
,
totalUncompressedBytesInArchive
,
totalFilesInArchive
,
));
};
// takes a ByteStream and parses out the local file information
var
TarLocalFile
=
function
(
bstream
)
{
this
.
isValid
=
false
;
var
bytesRead
=
0
;
// Read in the header block
this
.
name
=
readCleanString
(
bstream
,
100
);
this
.
mode
=
readCleanString
(
bstream
,
8
);
this
.
uid
=
readCleanString
(
bstream
,
8
);
this
.
gid
=
readCleanString
(
bstream
,
8
);
this
.
size
=
parseInt
(
readCleanString
(
bstream
,
12
),
8
);
this
.
mtime
=
readCleanString
(
bstream
,
12
);
this
.
chksum
=
readCleanString
(
bstream
,
8
);
this
.
typeflag
=
readCleanString
(
bstream
,
1
);
this
.
linkname
=
readCleanString
(
bstream
,
100
);
this
.
maybeMagic
=
readCleanString
(
bstream
,
6
);
if
(
this
.
maybeMagic
==
"ustar"
)
{
this
.
version
=
readCleanString
(
bstream
,
2
);
this
.
uname
=
readCleanString
(
bstream
,
32
);
this
.
gname
=
readCleanString
(
bstream
,
32
);
this
.
devmajor
=
readCleanString
(
bstream
,
8
);
this
.
devminor
=
readCleanString
(
bstream
,
8
);
this
.
prefix
=
readCleanString
(
bstream
,
155
);
if
(
this
.
prefix
.
length
)
{
this
.
name
=
this
.
prefix
+
this
.
name
;
}
bstream
.
readBytes
(
12
);
// 512 - 500
}
else
{
bstream
.
readBytes
(
255
);
// 512 - 257
}
bytesRead
+=
512
;
// Done header, now rest of blocks are the file contents.
this
.
filename
=
this
.
name
;
this
.
fileData
=
null
;
info
(
"Untarring file '"
+
this
.
filename
+
"'"
);
info
(
" size = "
+
this
.
size
);
info
(
" typeflag = "
+
this
.
typeflag
);
// A regular file.
if
(
this
.
typeflag
==
0
)
{
info
(
" This is a regular file."
);
var
sizeInBytes
=
parseInt
(
this
.
size
);
this
.
fileData
=
new
Uint8Array
(
bstream
.
readBytes
(
sizeInBytes
));
bytesRead
+=
sizeInBytes
;
if
(
this
.
name
.
length
>
0
&&
this
.
size
>
0
&&
this
.
fileData
&&
this
.
fileData
.
buffer
)
{
this
.
isValid
=
true
;
}
// Round up to 512-byte blocks.
var
remaining
=
512
-
bytesRead
%
512
;
if
(
remaining
>
0
&&
remaining
<
512
)
{
bstream
.
readBytes
(
remaining
);
}
}
else
if
(
this
.
typeflag
==
5
)
{
info
(
" This is a directory."
);
}
}
var
untar
=
function
(
arrayBuffer
)
{
postMessage
(
new
bitjs
.
archive
.
UnarchiveStartEvent
());
currentFilename
=
""
;
currentFileNumber
=
0
;
currentBytesUnarchivedInFile
=
0
;
currentBytesUnarchived
=
0
;
totalUncompressedBytesInArchive
=
0
;
totalFilesInArchive
=
0
;
allLocalFiles
=
[];
var
bstream
=
new
bitjs
.
io
.
ByteStream
(
arrayBuffer
);
postProgress
();
// While we don't encounter an empty block, keep making TarLocalFiles.
while
(
bstream
.
peekNumber
(
4
)
!=
0
)
{
var
oneLocalFile
=
new
TarLocalFile
(
bstream
);
if
(
oneLocalFile
&&
oneLocalFile
.
isValid
)
{
// If we make it to this point and haven't thrown an error, we have successfully
// read in the data for a local file, so we can update the actual bytestream.
allLocalFiles
.
push
(
oneLocalFile
);
totalUncompressedBytesInArchive
+=
oneLocalFile
.
size
;
// update progress
currentFilename
=
oneLocalFile
.
filename
;
currentFileNumber
=
totalFilesInArchive
++
;
currentBytesUnarchivedInFile
=
oneLocalFile
.
size
;
currentBytesUnarchived
+=
oneLocalFile
.
size
;
postMessage
(
new
bitjs
.
archive
.
UnarchiveExtractEvent
(
oneLocalFile
));
postProgress
();
}
}
totalFilesInArchive
=
allLocalFiles
.
length
;
postProgress
();
postMessage
(
new
bitjs
.
archive
.
UnarchiveFinishEvent
());
};
// event.data.file has the first ArrayBuffer.
// event.data.bytes has all subsequent ArrayBuffers.
onmessage
=
function
(
event
)
{
try
{
untar
(
event
.
data
.
file
,
true
);
}
catch
(
e
)
{
if
(
typeof
e
===
"string"
&&
e
.
startsWith
(
"Error! Overflowed"
))
{
// Overrun the buffer.
// unarchiveState = UnarchiveState.WAITING;
}
else
{
console
.
error
(
"Found an error while untarring"
);
console
.
log
(
e
);
throw
e
;
}
}
};
cps/static/js/unzip.js
→
cps/static/js/
archive/
unzip.js
View file @
26e45f1f
This diff is collapsed.
Click to expand it.
cps/static/js/bytestream.js
deleted
100644 → 0
View file @
df5d15d1
/*
* bytestream.js
*
* Provides readers for byte streams.
*
* Licensed under the MIT License
*
* Copyright(c) 2011 Google Inc.
* Copyright(c) 2011 antimatter15
*/
var
bitjs
=
bitjs
||
{};
bitjs
.
io
=
bitjs
.
io
||
{};
/**
* This object allows you to peek and consume bytes as numbers and strings out
* of a stream. More bytes can be pushed into the back of the stream via the
* push() method.
*/
bitjs
.
io
.
ByteStream
=
class
{
/**
* @param {ArrayBuffer} ab The ArrayBuffer object.
* @param {number=} opt_offset The offset into the ArrayBuffer
* @param {number=} opt_length The length of this BitStream
*/
constructor
(
ab
,
opt_offset
,
opt_length
)
{
if
(
!
(
ab
instanceof
ArrayBuffer
))
{
throw
'Error! BitArray constructed with an invalid ArrayBuffer object'
;
}
const
offset
=
opt_offset
||
0
;
const
length
=
opt_length
||
ab
.
byteLength
;
/**
* The current page of bytes in the stream.
* @type {Uint8Array}
* @private
*/
this
.
bytes
=
new
Uint8Array
(
ab
,
offset
,
length
);
/**
* The next pages of bytes in the stream.
* @type {Array<Uint8Array>}
* @private
*/
this
.
pages_
=
[];
/**
* The byte in the current page that we will read next.
* @type {Number}
* @private
*/
this
.
ptr
=
0
;
/**
* An ever-increasing number.
* @type {Number}
* @private
*/
this
.
bytesRead_
=
0
;
}
/**
* Returns how many bytes have been read in the stream since the beginning of time.
*/
getNumBytesRead
()
{
return
this
.
bytesRead_
;
}
/**
* Returns how many bytes are currently in the stream left to be read.
*/
getNumBytesLeft
()
{
const
bytesInCurrentPage
=
(
this
.
bytes
.
byteLength
-
this
.
ptr
);
return
this
.
pages_
.
reduce
((
acc
,
arr
)
=>
acc
+
arr
.
length
,
bytesInCurrentPage
);
}
/**
* Move the pointer ahead n bytes. If the pointer is at the end of the current array
* of bytes and we have another page of bytes, point at the new page. This is a private
* method, no validation is done.
* @param {number} n Number of bytes to increment.
* @private
*/
movePointer_
(
n
)
{
this
.
ptr
+=
n
;
this
.
bytesRead_
+=
n
;
while
(
this
.
ptr
>=
this
.
bytes
.
length
&&
this
.
pages_
.
length
>
0
)
{
this
.
ptr
-=
this
.
bytes
.
length
;
this
.
bytes
=
this
.
pages_
.
shift
();
}
}
/**
* Peeks at the next n bytes as an unsigned number but does not advance the
* pointer.
* @param {number} n The number of bytes to peek at. Must be a positive integer.
* @return {number} The n bytes interpreted as an unsigned number.
*/
peekNumber
(
n
)
{
const
num
=
parseInt
(
n
,
10
);
if
(
n
!==
num
||
num
<
0
)
{
throw
'Error! Called peekNumber() with a non-positive integer'
;
}
else
if
(
num
===
0
)
{
return
0
;
}
if
(
n
>
4
)
{
throw
'Error! Called peekNumber('
+
n
+
') but this method can only reliably read numbers up to 4 bytes long'
;
}
if
(
this
.
getNumBytesLeft
()
<
num
)
{
throw
'Error! Overflowed the byte stream while peekNumber()! n='
+
num
+
', ptr='
+
this
.
ptr
+
', bytes.length='
+
this
.
getNumBytesLeft
();
}
let
result
=
0
;
let
curPage
=
this
.
bytes
;
let
pageIndex
=
0
;
let
ptr
=
this
.
ptr
;
for
(
let
i
=
0
;
i
<
num
;
++
i
)
{
result
|=
(
curPage
[
ptr
++
]
<<
(
i
*
8
));
if
(
ptr
>=
curPage
.
length
)
{
curPage
=
this
.
pages_
[
pageIndex
++
];
ptr
=
0
;
}
}
return
result
;
}
/**
* Returns the next n bytes as an unsigned number (or -1 on error)
* and advances the stream pointer n bytes.
* @param {number} n The number of bytes to read. Must be a positive integer.
* @return {number} The n bytes interpreted as an unsigned number.
*/
readNumber
(
n
)
{
const
num
=
this
.
peekNumber
(
n
);
this
.
movePointer_
(
n
);
return
num
;
}
/**
* Returns the next n bytes as a signed number but does not advance the
* pointer.
* @param {number} n The number of bytes to read. Must be a positive integer.
* @return {number} The bytes interpreted as a signed number.
*/
peekSignedNumber
(
n
)
{
let
num
=
this
.
peekNumber
(
n
);
const
HALF
=
Math
.
pow
(
2
,
(
n
*
8
)
-
1
);
const
FULL
=
HALF
*
2
;
if
(
num
>=
HALF
)
num
-=
FULL
;
return
num
;
}
/**
* Returns the next n bytes as a signed number and advances the stream pointer.
* @param {number} n The number of bytes to read. Must be a positive integer.
* @return {number} The bytes interpreted as a signed number.
*/
readSignedNumber
(
n
)
{
const
num
=
this
.
peekSignedNumber
(
n
);
this
.
movePointer_
(
n
);
return
num
;
}
/**
* This returns n bytes as a sub-array, advancing the pointer if movePointers
* is true.
* @param {number} n The number of bytes to read. Must be a positive integer.
* @param {boolean} movePointers Whether to move the pointers.
* @return {Uint8Array} The subarray.
*/
peekBytes
(
n
,
movePointers
)
{
const
num
=
parseInt
(
n
,
10
);
if
(
n
!==
num
||
num
<
0
)
{
throw
'Error! Called peekBytes() with a non-positive integer'
;
}
else
if
(
num
===
0
)
{
return
new
Uint8Array
();
}
const
totalBytesLeft
=
this
.
getNumBytesLeft
();
if
(
num
>
totalBytesLeft
)
{
throw
'Error! Overflowed the byte stream during peekBytes! n='
+
num
+
', ptr='
+
this
.
ptr
+
', bytes.length='
+
this
.
getNumBytesLeft
();
}
const
result
=
new
Uint8Array
(
num
);
let
curPage
=
this
.
bytes
;
let
ptr
=
this
.
ptr
;
let
bytesLeftToCopy
=
num
;
let
pageIndex
=
0
;
while
(
bytesLeftToCopy
>
0
)
{
const
bytesLeftInPage
=
curPage
.
length
-
ptr
;
const
sourceLength
=
Math
.
min
(
bytesLeftToCopy
,
bytesLeftInPage
);
result
.
set
(
curPage
.
subarray
(
ptr
,
ptr
+
sourceLength
),
num
-
bytesLeftToCopy
);
ptr
+=
sourceLength
;
if
(
ptr
>=
curPage
.
length
)
{
curPage
=
this
.
pages_
[
pageIndex
++
];
ptr
=
0
;
}
bytesLeftToCopy
-=
sourceLength
;
}
if
(
movePointers
)
{
this
.
movePointer_
(
num
);
}
return
result
;
}
/**
* Reads the next n bytes as a sub-array.
* @param {number} n The number of bytes to read. Must be a positive integer.
* @return {Uint8Array} The subarray.
*/
readBytes
(
n
)
{
return
this
.
peekBytes
(
n
,
true
);
}
/**
* Peeks at the next n bytes as an ASCII string but does not advance the pointer.
* @param {number} n The number of bytes to peek at. Must be a positive integer.
* @return {string} The next n bytes as a string.
*/
peekString
(
n
)
{
const
num
=
parseInt
(
n
,
10
);
if
(
n
!==
num
||
num
<
0
)
{
throw
'Error! Called peekString() with a non-positive integer'
;
}
else
if
(
num
===
0
)
{
return
''
;
}
const
totalBytesLeft
=
this
.
getNumBytesLeft
();
if
(
num
>
totalBytesLeft
)
{
throw
'Error! Overflowed the byte stream while peekString()! n='
+
num
+
', ptr='
+
this
.
ptr
+
', bytes.length='
+
this
.
getNumBytesLeft
();
}
let
result
=
new
Array
(
num
);
let
curPage
=
this
.
bytes
;
let
pageIndex
=
0
;
let
ptr
=
this
.
ptr
;
for
(
let
i
=
0
;
i
<
num
;
++
i
)
{
result
[
i
]
=
String
.
fromCharCode
(
curPage
[
ptr
++
]);
if
(
ptr
>=
curPage
.
length
)
{
curPage
=
this
.
pages_
[
pageIndex
++
];
ptr
=
0
;
}
}
return
result
.
join
(
''
);
}
/**
* Returns the next n bytes as an ASCII string and advances the stream pointer
* n bytes.
* @param {number} n The number of bytes to read. Must be a positive integer.
* @return {string} The next n bytes as a string.
*/
readString
(
n
)
{
const
strToReturn
=
this
.
peekString
(
n
);
this
.
movePointer_
(
n
);
return
strToReturn
;
}
/**
* Feeds more bytes into the back of the stream.
* @param {ArrayBuffer} ab
*/
push
(
ab
)
{
if
(
!
(
ab
instanceof
ArrayBuffer
))
{
throw
'Error! ByteStream.push() called with an invalid ArrayBuffer object'
;
}
this
.
pages_
.
push
(
new
Uint8Array
(
ab
));
// If the pointer is at the end of the current page of bytes, this will advance
// to the next page.
this
.
movePointer_
(
0
);
}
/**
* Creates a new ByteStream from this ByteStream that can be read / peeked.
* @return {bitjs.io.ByteStream} A clone of this ByteStream.
*/
tee
()
{
const
clone
=
new
bitjs
.
io
.
ByteStream
(
this
.
bytes
.
buffer
);
clone
.
bytes
=
this
.
bytes
;
clone
.
ptr
=
this
.
ptr
;
clone
.
pages_
=
this
.
pages_
.
slice
();
clone
.
bytesRead_
=
this
.
bytesRead_
;
return
clone
;
}
}
cps/static/js/io/bitstream.js
0 → 100644
View file @
26e45f1f
/*
* bitstream.js
*
* Provides readers for bitstreams.
*
* Licensed under the MIT License
*
* Copyright(c) 2011 Google Inc.
* Copyright(c) 2011 antimatter15
*/
var
bitjs
=
bitjs
||
{};
bitjs
.
io
=
bitjs
.
io
||
{};
(
function
()
{
// mask for getting the Nth bit (zero-based)
bitjs
.
BIT
=
[
0x01
,
0x02
,
0x04
,
0x08
,
0x10
,
0x20
,
0x40
,
0x80
,
0x100
,
0x200
,
0x400
,
0x800
,
0x1000
,
0x2000
,
0x4000
,
0x8000
];
// mask for getting N number of bits (0-8)
var
BITMASK
=
[
0
,
0x01
,
0x03
,
0x07
,
0x0F
,
0x1F
,
0x3F
,
0x7F
,
0xFF
];
/**
* This bit stream peeks and consumes bits out of a binary stream.
*
* @param {ArrayBuffer} ab An ArrayBuffer object or a Uint8Array.
* @param {boolean} rtl Whether the stream reads bits from the byte starting
* from bit 7 to 0 (true) or bit 0 to 7 (false).
* @param {Number} opt_offset The offset into the ArrayBuffer
* @param {Number} opt_length The length of this BitStream
*/
bitjs
.
io
.
BitStream
=
function
(
ab
,
rtl
,
opt_offset
,
opt_length
)
{
if
(
!
ab
||
!
ab
.
toString
||
ab
.
toString
()
!==
"[object ArrayBuffer]"
)
{
throw
"Error! BitArray constructed with an invalid ArrayBuffer object"
;
}
var
offset
=
opt_offset
||
0
;
var
length
=
opt_length
||
ab
.
byteLength
;
this
.
bytes
=
new
Uint8Array
(
ab
,
offset
,
length
);
this
.
bytePtr
=
0
;
// tracks which byte we are on
this
.
bitPtr
=
0
;
// tracks which bit we are on (can have values 0 through 7)
this
.
peekBits
=
rtl
?
this
.
peekBits_rtl
:
this
.
peekBits_ltr
;
};
/**
* byte0 byte1 byte2 byte3
* 7......0 | 7......0 | 7......0 | 7......0
*
* The bit pointer starts at bit0 of byte0 and moves left until it reaches
* bit7 of byte0, then jumps to bit0 of byte1, etc.
* @param {number} n The number of bits to peek.
* @param {boolean=} movePointers Whether to move the pointer, defaults false.
* @return {number} The peeked bits, as an unsigned number.
*/
bitjs
.
io
.
BitStream
.
prototype
.
peekBits_ltr
=
function
(
n
,
movePointers
)
{
if
(
n
<=
0
||
typeof
n
!=
typeof
1
)
{
return
0
;
}
var
movePointers
=
movePointers
||
false
,
bytePtr
=
this
.
bytePtr
,
bitPtr
=
this
.
bitPtr
,
result
=
0
,
bitsIn
=
0
,
bytes
=
this
.
bytes
;
// keep going until we have no more bits left to peek at
// TODO: Consider putting all bits from bytes we will need into a variable and then
// shifting/masking it to just extract the bits we want.
// This could be considerably faster when reading more than 3 or 4 bits at a time.
while
(
n
>
0
)
{
if
(
bytePtr
>=
bytes
.
length
)
{
throw
"Error! Overflowed the bit stream! n="
+
n
+
", bytePtr="
+
bytePtr
+
", bytes.length="
+
bytes
.
length
+
", bitPtr="
+
bitPtr
;
return
-
1
;
}
var
numBitsLeftInThisByte
=
(
8
-
bitPtr
);
if
(
n
>=
numBitsLeftInThisByte
)
{
var
mask
=
(
BITMASK
[
numBitsLeftInThisByte
]
<<
bitPtr
);
result
|=
(((
bytes
[
bytePtr
]
&
mask
)
>>
bitPtr
)
<<
bitsIn
);
bytePtr
++
;
bitPtr
=
0
;
bitsIn
+=
numBitsLeftInThisByte
;
n
-=
numBitsLeftInThisByte
;
}
else
{
var
mask
=
(
BITMASK
[
n
]
<<
bitPtr
);
result
|=
(((
bytes
[
bytePtr
]
&
mask
)
>>
bitPtr
)
<<
bitsIn
);
bitPtr
+=
n
;
bitsIn
+=
n
;
n
=
0
;
}
}
if
(
movePointers
)
{
this
.
bitPtr
=
bitPtr
;
this
.
bytePtr
=
bytePtr
;
}
return
result
;
};
/**
* byte0 byte1 byte2 byte3
* 7......0 | 7......0 | 7......0 | 7......0
*
* The bit pointer starts at bit7 of byte0 and moves right until it reaches
* bit0 of byte0, then goes to bit7 of byte1, etc.
* @param {number} n The number of bits to peek.
* @param {boolean=} movePointers Whether to move the pointer, defaults false.
* @return {number} The peeked bits, as an unsigned number.
*/
bitjs
.
io
.
BitStream
.
prototype
.
peekBits_rtl
=
function
(
n
,
movePointers
)
{
if
(
n
<=
0
||
typeof
n
!=
typeof
1
)
{
return
0
;
}
var
movePointers
=
movePointers
||
false
,
bytePtr
=
this
.
bytePtr
,
bitPtr
=
this
.
bitPtr
,
result
=
0
,
bytes
=
this
.
bytes
;
// keep going until we have no more bits left to peek at
// TODO: Consider putting all bits from bytes we will need into a variable and then
// shifting/masking it to just extract the bits we want.
// This could be considerably faster when reading more than 3 or 4 bits at a time.
while
(
n
>
0
)
{
if
(
bytePtr
>=
bytes
.
length
)
{
throw
"Error! Overflowed the bit stream! n="
+
n
+
", bytePtr="
+
bytePtr
+
", bytes.length="
+
bytes
.
length
+
", bitPtr="
+
bitPtr
;
return
-
1
;
}
var
numBitsLeftInThisByte
=
(
8
-
bitPtr
);
if
(
n
>=
numBitsLeftInThisByte
)
{
result
<<=
numBitsLeftInThisByte
;
result
|=
(
BITMASK
[
numBitsLeftInThisByte
]
&
bytes
[
bytePtr
]);
bytePtr
++
;
bitPtr
=
0
;
n
-=
numBitsLeftInThisByte
;
}
else
{
result
<<=
n
;
result
|=
((
bytes
[
bytePtr
]
&
(
BITMASK
[
n
]
<<
(
8
-
n
-
bitPtr
)))
>>
(
8
-
n
-
bitPtr
));
bitPtr
+=
n
;
n
=
0
;
}
}
if
(
movePointers
)
{
this
.
bitPtr
=
bitPtr
;
this
.
bytePtr
=
bytePtr
;
}
return
result
;
};
/**
* Peek at 16 bits from current position in the buffer.
* Bit at (bytePtr,bitPtr) has the highest position in returning data.
* Taken from getbits.hpp in unrar.
* TODO: Move this out of BitStream and into unrar.
*/
bitjs
.
io
.
BitStream
.
prototype
.
getBits
=
function
()
{
return
(((((
this
.
bytes
[
this
.
bytePtr
]
&
0xff
)
<<
16
)
+
((
this
.
bytes
[
this
.
bytePtr
+
1
]
&
0xff
)
<<
8
)
+
((
this
.
bytes
[
this
.
bytePtr
+
2
]
&
0xff
)))
>>>
(
8
-
this
.
bitPtr
))
&
0xffff
);
};
/**
* Reads n bits out of the stream, consuming them (moving the bit pointer).
* @param {number} n The number of bits to read.
* @return {number} The read bits, as an unsigned number.
*/
bitjs
.
io
.
BitStream
.
prototype
.
readBits
=
function
(
n
)
{
return
this
.
peekBits
(
n
,
true
);
};
/**
* This returns n bytes as a sub-array, advancing the pointer if movePointers
* is true. Only use this for uncompressed blocks as this throws away remaining
* bits in the current byte.
* @param {number} n The number of bytes to peek.
* @param {boolean=} movePointers Whether to move the pointer, defaults false.
* @return {Uint8Array} The subarray.
*/
bitjs
.
io
.
BitStream
.
prototype
.
peekBytes
=
function
(
n
,
movePointers
)
{
if
(
n
<=
0
||
typeof
n
!=
typeof
1
)
{
return
0
;
}
// from http://tools.ietf.org/html/rfc1951#page-11
// "Any bits of input up to the next byte boundary are ignored."
while
(
this
.
bitPtr
!=
0
)
{
this
.
readBits
(
1
);
}
var
movePointers
=
movePointers
||
false
;
var
bytePtr
=
this
.
bytePtr
,
bitPtr
=
this
.
bitPtr
;
var
result
=
this
.
bytes
.
subarray
(
bytePtr
,
bytePtr
+
n
);
if
(
movePointers
)
{
this
.
bytePtr
+=
n
;
}
return
result
;
};
/**
* @param {number} n The number of bytes to read.
* @return {Uint8Array} The subarray.
*/
bitjs
.
io
.
BitStream
.
prototype
.
readBytes
=
function
(
n
)
{
return
this
.
peekBytes
(
n
,
true
);
};
})();
\ No newline at end of file
cps/static/js/io/bytebuffer.js
0 → 100644
View file @
26e45f1f
/*
* bytestream.js
*
* Provides a writer for bytes.
*
* Licensed under the MIT License
*
* Copyright(c) 2011 Google Inc.
* Copyright(c) 2011 antimatter15
*/
var
bitjs
=
bitjs
||
{};
bitjs
.
io
=
bitjs
.
io
||
{};
(
function
()
{
/**
* A write-only Byte buffer which uses a Uint8 Typed Array as a backing store.
* @param {number} numBytes The number of bytes to allocate.
* @constructor
*/
bitjs
.
io
.
ByteBuffer
=
function
(
numBytes
)
{
if
(
typeof
numBytes
!=
typeof
1
||
numBytes
<=
0
)
{
throw
"Error! ByteBuffer initialized with '"
+
numBytes
+
"'"
;
}
this
.
data
=
new
Uint8Array
(
numBytes
);
this
.
ptr
=
0
;
};
/**
* @param {number} b The byte to insert.
*/
bitjs
.
io
.
ByteBuffer
.
prototype
.
insertByte
=
function
(
b
)
{
// TODO: throw if byte is invalid?
this
.
data
[
this
.
ptr
++
]
=
b
;
};
/**
* @param {Array.<number>|Uint8Array|Int8Array} bytes The bytes to insert.
*/
bitjs
.
io
.
ByteBuffer
.
prototype
.
insertBytes
=
function
(
bytes
)
{
// TODO: throw if bytes is invalid?
this
.
data
.
set
(
bytes
,
this
.
ptr
);
this
.
ptr
+=
bytes
.
length
;
};
/**
* Writes an unsigned number into the next n bytes. If the number is too large
* to fit into n bytes or is negative, an error is thrown.
* @param {number} num The unsigned number to write.
* @param {number} numBytes The number of bytes to write the number into.
*/
bitjs
.
io
.
ByteBuffer
.
prototype
.
writeNumber
=
function
(
num
,
numBytes
)
{
if
(
numBytes
<
1
)
{
throw
'Trying to write into too few bytes: '
+
numBytes
;
}
if
(
num
<
0
)
{
throw
'Trying to write a negative number ('
+
num
+
') as an unsigned number to an ArrayBuffer'
;
}
if
(
num
>
(
Math
.
pow
(
2
,
numBytes
*
8
)
-
1
))
{
throw
'Trying to write '
+
num
+
' into only '
+
numBytes
+
' bytes'
;
}
// Roll 8-bits at a time into an array of bytes.
var
bytes
=
[];
while
(
numBytes
--
>
0
)
{
var
eightBits
=
num
&
255
;
bytes
.
push
(
eightBits
);
num
>>=
8
;
}
this
.
insertBytes
(
bytes
);
};
/**
* Writes a signed number into the next n bytes. If the number is too large
* to fit into n bytes, an error is thrown.
* @param {number} num The signed number to write.
* @param {number} numBytes The number of bytes to write the number into.
*/
bitjs
.
io
.
ByteBuffer
.
prototype
.
writeSignedNumber
=
function
(
num
,
numBytes
)
{
if
(
numBytes
<
1
)
{
throw
'Trying to write into too few bytes: '
+
numBytes
;
}
var
HALF
=
Math
.
pow
(
2
,
(
numBytes
*
8
)
-
1
);
if
(
num
>=
HALF
||
num
<
-
HALF
)
{
throw
'Trying to write '
+
num
+
' into only '
+
numBytes
+
' bytes'
;
}
// Roll 8-bits at a time into an array of bytes.
var
bytes
=
[];
while
(
numBytes
--
>
0
)
{
var
eightBits
=
num
&
255
;
bytes
.
push
(
eightBits
);
num
>>=
8
;
}
this
.
insertBytes
(
bytes
);
};
/**
* @param {string} str The ASCII string to write.
*/
bitjs
.
io
.
ByteBuffer
.
prototype
.
writeASCIIString
=
function
(
str
)
{
for
(
var
i
=
0
;
i
<
str
.
length
;
++
i
)
{
var
curByte
=
str
.
charCodeAt
(
i
);
if
(
curByte
<
0
||
curByte
>
255
)
{
throw
'Trying to write a non-ASCII string!'
;
}
this
.
insertByte
(
curByte
);
}
};
})();
\ No newline at end of file
cps/static/js/io/bytestream.js
0 → 100644
View file @
26e45f1f
/*
* bytestream.js
*
* Provides readers for byte streams.
*
* Licensed under the MIT License
*
* Copyright(c) 2011 Google Inc.
* Copyright(c) 2011 antimatter15
*/
var
bitjs
=
bitjs
||
{};
bitjs
.
io
=
bitjs
.
io
||
{};
(
function
()
{
/**
* This object allows you to peek and consume bytes as numbers and strings
* out of an ArrayBuffer. In this buffer, everything must be byte-aligned.
*
* @param {ArrayBuffer} ab The ArrayBuffer object.
* @param {number=} opt_offset The offset into the ArrayBuffer
* @param {number=} opt_length The length of this BitStream
* @constructor
*/
bitjs
.
io
.
ByteStream
=
function
(
ab
,
opt_offset
,
opt_length
)
{
var
offset
=
opt_offset
||
0
;
var
length
=
opt_length
||
ab
.
byteLength
;
this
.
bytes
=
new
Uint8Array
(
ab
,
offset
,
length
);
this
.
ptr
=
0
;
};
/**
* Peeks at the next n bytes as an unsigned number but does not advance the
* pointer
* TODO: This apparently cannot read more than 4 bytes as a number?
* @param {number} n The number of bytes to peek at.
* @return {number} The n bytes interpreted as an unsigned number.
*/
bitjs
.
io
.
ByteStream
.
prototype
.
peekNumber
=
function
(
n
)
{
// TODO: return error if n would go past the end of the stream?
if
(
n
<=
0
||
typeof
n
!=
typeof
1
)
return
-
1
;
var
result
=
0
;
// read from last byte to first byte and roll them in
var
curByte
=
this
.
ptr
+
n
-
1
;
while
(
curByte
>=
this
.
ptr
)
{
result
<<=
8
;
result
|=
this
.
bytes
[
curByte
];
--
curByte
;
}
return
result
;
};
/**
* Returns the next n bytes as an unsigned number (or -1 on error)
* and advances the stream pointer n bytes.
* @param {number} n The number of bytes to read.
* @return {number} The n bytes interpreted as an unsigned number.
*/
bitjs
.
io
.
ByteStream
.
prototype
.
readNumber
=
function
(
n
)
{
var
num
=
this
.
peekNumber
(
n
);
this
.
ptr
+=
n
;
return
num
;
};
/**
* Returns the next n bytes as a signed number but does not advance the
* pointer.
* @param {number} n The number of bytes to read.
* @return {number} The bytes interpreted as a signed number.
*/
bitjs
.
io
.
ByteStream
.
prototype
.
peekSignedNumber
=
function
(
n
)
{
var
num
=
this
.
peekNumber
(
n
);
var
HALF
=
Math
.
pow
(
2
,
(
n
*
8
)
-
1
);
var
FULL
=
HALF
*
2
;
if
(
num
>=
HALF
)
num
-=
FULL
;
return
num
;
};
/**
* Returns the next n bytes as a signed number and advances the stream pointer.
* @param {number} n The number of bytes to read.
* @return {number} The bytes interpreted as a signed number.
*/
bitjs
.
io
.
ByteStream
.
prototype
.
readSignedNumber
=
function
(
n
)
{
var
num
=
this
.
peekSignedNumber
(
n
);
this
.
ptr
+=
n
;
return
num
;
};
/**
* This returns n bytes as a sub-array, advancing the pointer if movePointers
* is true.
* @param {number} n The number of bytes to read.
* @param {boolean} movePointers Whether to move the pointers.
* @return {Uint8Array} The subarray.
*/
bitjs
.
io
.
ByteStream
.
prototype
.
peekBytes
=
function
(
n
,
movePointers
)
{
if
(
n
<=
0
||
typeof
n
!=
typeof
1
)
{
return
null
;
}
var
result
=
this
.
bytes
.
subarray
(
this
.
ptr
,
this
.
ptr
+
n
);
if
(
movePointers
)
{
this
.
ptr
+=
n
;
}
return
result
;
};
/**
* Reads the next n bytes as a sub-array.
* @param {number} n The number of bytes to read.
* @return {Uint8Array} The subarray.
*/
bitjs
.
io
.
ByteStream
.
prototype
.
readBytes
=
function
(
n
)
{
return
this
.
peekBytes
(
n
,
true
);
};
/**
* Peeks at the next n bytes as a string but does not advance the pointer.
* @param {number} n The number of bytes to peek at.
* @return {string} The next n bytes as a string.
*/
bitjs
.
io
.
ByteStream
.
prototype
.
peekString
=
function
(
n
)
{
if
(
n
<=
0
||
typeof
n
!=
typeof
1
)
{
return
""
;
}
var
result
=
""
;
for
(
var
p
=
this
.
ptr
,
end
=
this
.
ptr
+
n
;
p
<
end
;
++
p
)
{
result
+=
String
.
fromCharCode
(
this
.
bytes
[
p
]);
}
return
result
;
};
/**
* Returns the next n bytes as an ASCII string and advances the stream pointer
* n bytes.
* @param {number} n The number of bytes to read.
* @return {string} The next n bytes as a string.
*/
bitjs
.
io
.
ByteStream
.
prototype
.
readString
=
function
(
n
)
{
var
strToReturn
=
this
.
peekString
(
n
);
this
.
ptr
+=
n
;
return
strToReturn
;
};
})();
cps/static/js/kthoom.js
View file @
26e45f1f
...
...
@@ -16,7 +16,6 @@
*/
/* global screenfull, bitjs */
if
(
window
.
opera
)
{
window
.
console
.
log
=
function
(
str
)
{
opera
.
postError
(
str
);
...
...
@@ -160,11 +159,16 @@ function initProgressClick() {
function
loadFromArrayBuffer
(
ab
)
{
var
start
=
(
new
Date
).
getTime
();
var
h
=
new
Uint8Array
(
ab
,
0
,
10
);
var
pathToBitJS
=
"../../static/js/"
;
var
pathToBitJS
=
"../../static/js/
archive/
"
;
if
(
h
[
0
]
===
0x52
&&
h
[
1
]
===
0x61
&&
h
[
2
]
===
0x72
&&
h
[
3
]
===
0x21
)
{
//Rar!
unarchiver
=
new
bitjs
.
archive
.
Unrarrer
(
ab
,
pathToBitJS
);
}
else
if
(
h
[
0
]
===
80
&&
h
[
1
]
===
75
)
{
//PK (Zip)
unarchiver
=
new
bitjs
.
archive
.
Unzipper
(
ab
,
pathToBitJS
);
}
else
if
(
h
[
0
]
==
255
&&
h
[
1
]
==
216
)
{
// JPEG
// ToDo: check
updateProgress
(
100
);
lastCompletion
=
100
;
return
;
}
else
{
// Try with tar
unarchiver
=
new
bitjs
.
archive
.
Untarrer
(
ab
,
pathToBitJS
);
}
...
...
@@ -179,6 +183,10 @@ function loadFromArrayBuffer(ab) {
updateProgress
(
percentage
*
100
);
lastCompletion
=
percentage
*
100
;
});
unarchiver
.
addEventListener
(
bitjs
.
archive
.
UnarchiveEvent
.
Type
.
INFO
,
function
(
e
)
{
// console.log(e.msg); 77 Enable debug output here
});
unarchiver
.
addEventListener
(
bitjs
.
archive
.
UnarchiveEvent
.
Type
.
EXTRACT
,
function
(
e
)
{
// convert DecompressedFile into a bunch of ImageFiles
...
...
cps/static/js/untar.js
deleted
100644 → 0
View file @
df5d15d1
/**
* untar.js
*
* Licensed under the MIT License
*
* Copyright(c) 2011 Google Inc.
*
* Reference Documentation:
*
* TAR format: http://www.gnu.org/software/automake/manual/tar/Standard.html
*/
// This file expects to be invoked as a Worker (see onmessage below).
importScripts
(
'bytestream.js'
);
importScripts
(
'archive.js'
);
const
UnarchiveState
=
{
NOT_STARTED
:
0
,
UNARCHIVING
:
1
,
WAITING
:
2
,
FINISHED
:
3
,
};
// State - consider putting these into a class.
let
unarchiveState
=
UnarchiveState
.
NOT_STARTED
;
let
bytestream
=
null
;
let
allLocalFiles
=
null
;
let
logToConsole
=
false
;
// Progress variables.
let
currentFilename
=
""
;
let
currentFileNumber
=
0
;
let
currentBytesUnarchivedInFile
=
0
;
let
currentBytesUnarchived
=
0
;
let
totalUncompressedBytesInArchive
=
0
;
let
totalFilesInArchive
=
0
;
// Helper functions.
const
info
=
function
(
str
)
{
postMessage
(
new
bitjs
.
archive
.
UnarchiveInfoEvent
(
str
));
};
const
err
=
function
(
str
)
{
postMessage
(
new
bitjs
.
archive
.
UnarchiveErrorEvent
(
str
));
};
// Removes all characters from the first zero-byte in the string onwards.
var
readCleanString
=
function
(
bstr
,
numBytes
)
{
var
str
=
bstr
.
readString
(
numBytes
);
var
zIndex
=
str
.
indexOf
(
String
.
fromCharCode
(
0
));
return
zIndex
!=
-
1
?
str
.
substr
(
0
,
zIndex
)
:
str
;
};
const
postProgress
=
function
()
{
postMessage
(
new
bitjs
.
archive
.
UnarchiveProgressEvent
(
currentFilename
,
currentFileNumber
,
currentBytesUnarchivedInFile
,
currentBytesUnarchived
,
totalUncompressedBytesInArchive
,
totalFilesInArchive
,
bytestream
.
getNumBytesRead
(),
));
};
class
TarLocalFile
{
// takes a ByteStream and parses out the local file information
constructor
(
bstream
)
{
this
.
isValid
=
false
;
let
bytesRead
=
0
;
// Read in the header block
this
.
name
=
readCleanString
(
bstream
,
100
);
this
.
mode
=
readCleanString
(
bstream
,
8
);
this
.
uid
=
readCleanString
(
bstream
,
8
);
this
.
gid
=
readCleanString
(
bstream
,
8
);
this
.
size
=
parseInt
(
readCleanString
(
bstream
,
12
),
8
);
this
.
mtime
=
readCleanString
(
bstream
,
12
);
this
.
chksum
=
readCleanString
(
bstream
,
8
);
this
.
typeflag
=
readCleanString
(
bstream
,
1
);
this
.
linkname
=
readCleanString
(
bstream
,
100
);
this
.
maybeMagic
=
readCleanString
(
bstream
,
6
);
if
(
this
.
maybeMagic
==
"ustar"
)
{
this
.
version
=
readCleanString
(
bstream
,
2
);
this
.
uname
=
readCleanString
(
bstream
,
32
);
this
.
gname
=
readCleanString
(
bstream
,
32
);
this
.
devmajor
=
readCleanString
(
bstream
,
8
);
this
.
devminor
=
readCleanString
(
bstream
,
8
);
this
.
prefix
=
readCleanString
(
bstream
,
155
);
if
(
this
.
prefix
.
length
)
{
this
.
name
=
this
.
prefix
+
this
.
name
;
}
bstream
.
readBytes
(
12
);
// 512 - 500in
}
else
{
bstream
.
readBytes
(
255
);
// 512 - 257
}
bytesRead
+=
512
;
// Done header, now rest of blocks are the file contents.
this
.
filename
=
this
.
name
;
this
.
fileData
=
null
;
info
(
"Untarring file '"
+
this
.
filename
+
"'"
);
info
(
" size = "
+
this
.
size
);
info
(
" typeflag = "
+
this
.
typeflag
);
// A regular file.
if
(
this
.
typeflag
==
0
)
{
info
(
" This is a regular file."
);
const
sizeInBytes
=
parseInt
(
this
.
size
);
this
.
fileData
=
new
Uint8Array
(
bstream
.
readBytes
(
sizeInBytes
));
bytesRead
+=
sizeInBytes
;
if
(
this
.
name
.
length
>
0
&&
this
.
size
>
0
&&
this
.
fileData
&&
this
.
fileData
.
buffer
)
{
this
.
isValid
=
true
;
}
// Round up to 512-byte blocks.
const
remaining
=
512
-
bytesRead
%
512
;
if
(
remaining
>
0
&&
remaining
<
512
)
{
bstream
.
readBytes
(
remaining
);
}
}
else
if
(
this
.
typeflag
==
5
)
{
info
(
" This is a directory."
)
}
}
}
const
untar
=
function
()
{
let
bstream
=
bytestream
.
tee
();
// While we don't encounter an empty block, keep making TarLocalFiles.
while
(
bstream
.
peekNumber
(
4
)
!=
0
)
{
const
oneLocalFile
=
new
TarLocalFile
(
bstream
);
if
(
oneLocalFile
&&
oneLocalFile
.
isValid
)
{
// If we make it to this point and haven't thrown an error, we have successfully
// read in the data for a local file, so we can update the actual bytestream.
bytestream
=
bstream
.
tee
();
allLocalFiles
.
push
(
oneLocalFile
);
totalUncompressedBytesInArchive
+=
oneLocalFile
.
size
;
// update progress
currentFilename
=
oneLocalFile
.
filename
;
currentFileNumber
=
totalFilesInArchive
++
;
currentBytesUnarchivedInFile
=
oneLocalFile
.
size
;
currentBytesUnarchived
+=
oneLocalFile
.
size
;
postMessage
(
new
bitjs
.
archive
.
UnarchiveExtractEvent
(
oneLocalFile
));
postProgress
();
}
}
totalFilesInArchive
=
allLocalFiles
.
length
;
postProgress
();
bytestream
=
bstream
.
tee
();
};
// event.data.file has the first ArrayBuffer.
// event.data.bytes has all subsequent ArrayBuffers.
onmessage
=
function
(
event
)
{
const
bytes
=
event
.
data
.
file
||
event
.
data
.
bytes
;
logToConsole
=
!!
event
.
data
.
logToConsole
;
// This is the very first time we have been called. Initialize the bytestream.
if
(
!
bytestream
)
{
bytestream
=
new
bitjs
.
io
.
ByteStream
(
bytes
);
}
else
{
bytestream
.
push
(
bytes
);
}
if
(
unarchiveState
===
UnarchiveState
.
NOT_STARTED
)
{
currentFilename
=
""
;
currentFileNumber
=
0
;
currentBytesUnarchivedInFile
=
0
;
currentBytesUnarchived
=
0
;
totalUncompressedBytesInArchive
=
0
;
totalFilesInArchive
=
0
;
allLocalFiles
=
[];
postMessage
(
new
bitjs
.
archive
.
UnarchiveStartEvent
());
unarchiveState
=
UnarchiveState
.
UNARCHIVING
;
postProgress
();
}
if
(
unarchiveState
===
UnarchiveState
.
UNARCHIVING
||
unarchiveState
===
UnarchiveState
.
WAITING
)
{
try
{
untar
();
unarchiveState
=
UnarchiveState
.
FINISHED
;
postMessage
(
new
bitjs
.
archive
.
UnarchiveFinishEvent
());
}
catch
(
e
)
{
if
(
typeof
e
===
'string'
&&
e
.
startsWith
(
'Error! Overflowed'
))
{
// Overrun the buffer.
unarchiveState
=
UnarchiveState
.
WAITING
;
}
else
{
console
.
error
(
'Found an error while untarring'
);
console
.
dir
(
e
);
throw
e
;
}
}
}
};
cps/templates/readcbr.html
View file @
26e45f1f
<!DOCTYPE html>
<html>
<head>
<title>
Comic Reader
</title>
<meta
charset=
"utf-8"
>
<meta
http-equiv=
"X-UA-Compatible"
content=
"IE=edge,chrome=1"
>
<title>
Comic Reader
</title>
<meta
name=
"description"
content=
""
>
<meta
name=
"viewport"
content=
"width=device-width, user-scalable=no"
>
<meta
name=
"apple-mobile-web-app-capable"
content=
"yes"
>
...
...
@@ -15,7 +15,7 @@
<script
src=
"{{ url_for('static', filename='js/libs/jquery.min.js') }}"
></script>
<script
src=
"{{ url_for('static', filename='js/libs/screenfull.min.js') }}"
></script>
<script
src=
"{{ url_for('static', filename='js/kthoom.js') }}"
></script>
<script
src=
"{{ url_for('static', filename='js/archive.js') }}"
></script>
<script
src=
"{{ url_for('static', filename='js/archive
/archive
.js') }}"
></script>
<script>
var
updateArrows
=
function
()
{
if
(
$
(
'input[name="direction"]:checked'
).
val
()
===
"0"
)
{
...
...
@@ -31,17 +31,11 @@
init
(
"{{ url_for('serve_book', book_id=comicfile, book_format=extension) }}"
);
updateArrows
();
}
}
;
}
</script>
</head>
<body>
<div
id=
"sidebar"
>
<!--
<div id="panels">
<a id="show-Toc" class="show_view icon-list-1 active" data-view="Toc">TOC</a>
<a id="show-Bookmarks" class="show_view icon-bookmark" data-view="Bookmarks">Bookmarks</a>
</div>
-->
<div
id=
"tocView"
class=
"view"
tabindex=
"-1"
>
<ul
id=
"thumbnails"
></ul>
</div>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment