|
|
|
@ -99,6 +99,36 @@ function Document:discardChange()
|
|
|
|
|
self.is_edited = false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- calculate partial digest of the document
|
|
|
|
|
-- since only PDF documents could be modified by koreader by appending data
|
|
|
|
|
-- at the end of the files when highlighting, we use a non-even sampling
|
|
|
|
|
-- algorithm which samples with larger weight at file head and much smaller
|
|
|
|
|
-- weight at file tail, thus reduces the probability that appended data may change
|
|
|
|
|
-- the digest value.
|
|
|
|
|
-- Note that if PDF file size is around 1024, 4096, 16384, 65536, 262144
|
|
|
|
|
-- 1048576, 4194304, 16777216, 67108864, 268435456 or 1073741824, appending data
|
|
|
|
|
-- by highlighting in koreader may change the digest value.
|
|
|
|
|
function Document:fastDigest()
|
|
|
|
|
local md5 = require("MD5")
|
|
|
|
|
local lshift = bit.lshift
|
|
|
|
|
local file = io.open(self.file, 'rb')
|
|
|
|
|
if file then
|
|
|
|
|
local step, size = 1024, 1024
|
|
|
|
|
md5:new()
|
|
|
|
|
for i = -1, 10 do
|
|
|
|
|
file:seek("set", lshift(step, 2*i))
|
|
|
|
|
local sample = file:read(size)
|
|
|
|
|
if sample then
|
|
|
|
|
md5:update(sample)
|
|
|
|
|
else
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
file:close()
|
|
|
|
|
return md5:sum()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- this might be overridden by a document implementation
|
|
|
|
|
function Document:getNativePageDimensions(pageno)
|
|
|
|
|
local hash = "pgdim|"..self.file.."|"..pageno
|
|
|
|
|