1 /*
2  * The Sleuth Kit
3  *
4  * Contact: Brian Carrier [carrier <at> sleuthkit [dot] org]
5  * Copyright (c) 2010-2012 Basis Technology Corporation. All Rights
6  * reserved.
7  *
8  * This software is distributed under the Common Public License 1.0
9  */
10 
11 #include <string>
12 
13 #include "TskServices.h"
14 #include "tsk/framework/utilities/TskException.h"
15 #include "tsk/framework/services/TskSystemPropertiesImpl.h"
16 
17 TskServices *TskServices::m_pInstance = NULL;
18 
19 /**
20  * Singleton interface to return the TskServices instance.
21  */
Instance()22 TskServices &TskServices::Instance()
23 {
24     if (!m_pInstance) {
25         m_pInstance = new TskServices;
26         m_pInstance->m_log = NULL;
27         m_pInstance->m_scheduler = NULL;
28         m_pInstance->m_imgDB = NULL;
29         m_pInstance->m_blackboard = NULL;
30         m_pInstance->m_systemProperties = NULL;
31         m_pInstance->m_imageFile = NULL;
32         m_pInstance->m_fileManager = NULL;
33     }
34     return *m_pInstance;
35 }
36 
37 /**
38  * Return the system log service.  If no log was setup, a service will be
39  * created that sends messages to stderr.
40  * @returns log reference.
41  */
getLog()42 Log& TskServices::getLog()
43 {
44     // create a default one if it has not been set yet
45     if (!m_log) {
46         m_defaultLog.logInfo(L"TskServices::getLog - Log has not been set, using default implementation.");
47         return m_defaultLog;
48     }
49     return *m_log;
50 }
51 
52 /**
53  * Set the log service.
54  * Throws an exception if one has already been set.
55  */
setLog(Log & log)56 void TskServices::setLog(Log &log)
57 {
58     if (m_log) {
59         LOGERROR(L"TskServices::setLog - Log has already been initialized.");
60         throw TskException("Log already initialized.");
61     } else {
62         m_log = &log;
63     }
64 }
65 
66 /**
67  * Return the system scheduler service.  If no service was setup, an exception
68  * is thrown.
69  * @returns scheduler reference.
70  */
getScheduler()71 Scheduler& TskServices::getScheduler()
72 {
73     if (m_scheduler == NULL)
74     {
75         LOGERROR(L"TskServices::getScheduler - Scheduler has not been initialized.");
76         throw TskException("Scheduler not initialized.");
77     }
78 
79     return *m_scheduler;
80 }
81 
82 /**
83  * Set the scheduler service.
84  * Throws an exception if one has already been set.
85  */
setScheduler(Scheduler & scheduler)86 void TskServices::setScheduler(Scheduler &scheduler)
87 {
88     if (m_scheduler) {
89         LOGERROR(L"TskServices::setScheduler - Scheduler has already been initialized.");
90         throw TskException("Scheduler already initialized.");
91     } else {
92         m_scheduler = &scheduler;
93     }
94 }
95 
96 
97 /**
98  * Return the database service.  If no service was setup, an exception
99  * is thrown.
100  * @returns database reference.
101  */
getImgDB()102 TskImgDB& TskServices::getImgDB()
103 {
104     if (m_imgDB == NULL)
105     {
106         LOGERROR(L"TskServices::getImgDB - ImgDB has not been initialized.");
107         throw TskException("ImgDB not initialized.");
108     }
109 
110     return *m_imgDB;
111 }
112 
113 /**
114  * Set the database service.
115  * Throws an exception if one has already been set.
116  */
setImgDB(TskImgDB & imgDB)117 void TskServices::setImgDB(TskImgDB& imgDB)
118 {
119     if (m_imgDB) {
120         LOGERROR(L"TskServices::setImgDB - ImgDB has already been initialized.");
121         throw TskException("ImgDB already initialized.");
122     } else {
123         m_imgDB = &imgDB;
124     }
125 }
126 
127 
128 
129 /**
130  * Set the image file service.
131  * Throws an exception if one has already been set.
132  */
setImageFile(TskImageFile & imageFile)133 void TskServices::setImageFile(TskImageFile& imageFile)
134 {
135     if (m_imageFile) {
136         LOGERROR(L"TskServices::setImageFile - ImageFile has already been initialized.");
137         throw TskException("ImageFile already initialized.");
138     } else {
139         m_imageFile = &imageFile;
140     }
141 }
142 
143 /**
144  * Return the image file service.  If no service was setup, an exception
145  * is thrown.
146  * @returns image file reference.
147  */
getImageFile()148 TskImageFile& TskServices::getImageFile()
149 {
150     if (m_imageFile == NULL)
151     {
152         LOGERROR(L"TskServices::getImageFile - ImageFile has not been initialized.");
153         throw TskException("ImageFile not initialized.");
154     }
155 
156     return *m_imageFile;
157 }
158 
159 /**
160  * Set the blackboard service.
161  * Throws an exception if one has already been set.
162  */
setBlackboard(TskBlackboard & blackboard)163 void TskServices::setBlackboard(TskBlackboard& blackboard)
164 {
165     if (m_blackboard) {
166         LOGERROR(L"TskServices::setBlackboard - Blackboard has already been initialized.");
167         throw TskException("Blackboard already initialized.");
168     } else {
169         m_blackboard = &blackboard;
170     }
171 }
172 
173 /**
174  * Return the blackboard service.  If no service was setup, an exception
175  * is thrown.
176  * @returns blackboard file reference.
177  */
getBlackboard()178 TskBlackboard& TskServices::getBlackboard()
179 {
180     if (m_blackboard == NULL)
181     {
182         LOGERROR(L"TskServices::getBlackboard - Blackboard has not been initialized.");
183         throw TskException("Blackboard not initialized.");
184     }
185     return *m_blackboard;
186 }
187 
188 /**
189  * Set the system properties service.
190  * Throws an exception if one has already been set.
191  */
setSystemProperties(TskSystemProperties & systemProperties)192 void TskServices::setSystemProperties(TskSystemProperties& systemProperties)
193 {
194     if (m_systemProperties) {
195         LOGERROR(L"TskServices::setSystemProperties - SystemProperties has already been initialized.");
196         throw TskException("SystemProperties already initialized.");
197     } else {
198         m_systemProperties = &systemProperties;
199     }
200 }
201 
202 /**
203  * Return the system properties service.  If no service was setup, a
204  * default memory-based version is created.
205  * @returns system properties reference.
206  */
getSystemProperties()207 TskSystemProperties& TskServices::getSystemProperties()
208 {
209     if (m_systemProperties == NULL)
210     {
211         TskSystemPropertiesImpl *prop = new TskSystemPropertiesImpl();
212         prop->initialize();
213         setSystemProperties(*prop);
214 
215         LOGINFO(L"TskServices::getSystemProperties - SystemProperties has not been set, using default implementation.");
216     }
217     return *m_systemProperties;
218 }
219 
setFileManager(TskFileManager & fileManager)220 void TskServices::setFileManager(TskFileManager& fileManager)
221 {
222     if (m_fileManager) {
223         LOGERROR(L"TskServices::setFileManager - File Manager has already been initialized.");
224         throw TskException("FileManager already initialized.");
225     } else {
226         m_fileManager = &fileManager;
227     }
228 }
229 
getFileManager()230 TskFileManager& TskServices::getFileManager()
231 {
232     if (m_fileManager == NULL)
233     {
234         LOGERROR(L"TskServices::getFileManager - File Manager has not been initialized.");
235         throw TskException("File Manager not initialized.");
236     }
237     return *m_fileManager;
238 }
239