1# -*- coding: UTF-8 -*-
2"""
3module vinutils.py
4-----------------------------------------------------------------------------
5
6 Vinetto : a forensics tool to examine Thumbs.db files
7 Copyright (C) 2005, 2006 by Michel Roukine
8
9This file is part of Vinetto.
10
11 Vinetto is free software; you can redistribute it and/or
12 modify it under the terms of the GNU General Public License as published
13 by the Free Software Foundation; either version 2 of the License, or (at
14 your option) any later version.
15
16 Vinetto is distributed in the hope that it will be
17 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 General Public License for more details.
20
21 You should have received a copy of the GNU General Public License along
22 with the vinetto package; if not, write to the Free Software
23 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24
25-----------------------------------------------------------------------------
26"""
27
28__revision__ = "$Revision: 47 $"
29__version__ = "0.01"
30__author__ = 'Michel Roukine'
31
32Catalog = {}
33catIndxOutOfSeqFlag = False
34iCatPrec = None
35
36TNStreams = {}
37tnStreamOutOfSeqFlag = False
38iTnsPrec = None
39
40
41def catIndxOutOfSeq():
42    """Return catIndxOutOfSeqFlag value.  """
43    return catIndxOutOfSeqFlag
44
45
46def tnStreamOutOfSeq():
47    """Return tnStreamOutOfSeqFlag value.  """
48    return tnStreamOutOfSeqFlag
49
50
51def addCatEntry (iCat, timestamp, TNname):
52    """Add a new Catalog entry.  """
53    global catIndxOutOfSeqFlag, iCatPrec
54    if iCatPrec != None:
55        if iCat != (iCatPrec + 1) :
56            catIndxOutOfSeqFlag = True
57
58    if Catalog.has_key(iCat):
59        Catalog[iCat].append((timestamp, TNname))
60    else:
61        Catalog[iCat] = [(timestamp, TNname)]
62
63    iCatPrec = iCat
64    return
65
66
67def addTNStream (iTN, vType, filename):
68    """Add new thumbnail stream references.  """
69    global tnStreamOutOfSeqFlag, iTnsPrec
70    if iTnsPrec != None:
71        if iTN != (iTnsPrec + 1) :
72            tnStreamOutOfSeqFlag = True
73
74    if TNStreams.has_key(iTN):
75        TNStreams[iTN].append((vType, filename))
76    else:
77        TNStreams[iTN] = [(vType, filename)]
78
79    iTnsPrec = iTN
80    return
81
82
83def nbCatEnt ():
84    """Return number of Catalog entry.  """
85    nb = 0
86    for k in Catalog:
87        nb += len(Catalog[k])
88    return nb
89
90
91def nbTNstr (*vt):
92    """Return number of extracted/unextracted thumbnails.  """
93    nb = 0
94    if len(vt) == 0:
95        for k in TNStreams:
96            nb += len(TNStreams[k])
97        return nb
98    else :
99        nb = 0
100        for k in TNStreams:
101            for (vType, filename) in TNStreams[k]:
102                if vt[0] == vType :
103                    nb += 1
104        return nb
105
106
107def extractStats(outputdir):
108    """Return extraction statistics.  """
109    extr = {"1":0, "2":0}
110    unextr = {"1":0, "2":0}
111    statstring = ""
112    odstr = ""
113    if outputdir != None:
114        odstr = " to " + outputdir
115
116    for k in TNStreams:
117        for (vType, filename) in TNStreams[k]:
118            if filename == "" :
119                unextr[vType] += 1
120            else:
121                extr[vType] += 1
122
123    for vt in extr:
124        if extr[vt] > 0:
125            statstring += str(extr[vt]) + " Type " + vt + \
126                          " thumbnails extracted" + odstr + "\n"
127
128    for vt in unextr:
129        if unextr[vt] > 0:
130            statstring += str(unextr[vt]) + " Type " + vt + \
131                          " thumbnails unextracted" + odstr + "\n"
132    return statstring
133
134
135def getCatEntry(iCat):
136    """Return iCat Catalog entry.  """
137    if Catalog.has_key(iCat):
138            return Catalog[iCat]
139    return []
140
141
142def fincrement (filename):
143    """ Compute next "valid" filename for a given SID. """
144    if filename.find("_") < 0:
145        return filename + "_1"
146    else:
147        i = int(filename[filename.find('_') + 1:])
148        return filename[:filename.find('_') + 1] + str(i + 1)
149
150
151def TNfname(SIDstr, vType):
152    """ Compute filenames for thumbnails.  """
153    computedfn = SIDstr
154    k = int(SIDstr)
155    if TNStreams.has_key(k):
156    # duplicate index numbers
157        for (vtyp, filename) in TNStreams[k]:
158            if computedfn == filename:
159                computedfn = fincrement (filename)
160    addTNStream(k, vType, computedfn)
161    return computedfn
162