| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 1 | //===-- MICmnLLDBDebugSessionInfo.h -----------------------------*- C++ -*-===// | 
|  | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 |  | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 10 | #pragma once | 
|  | 11 |  | 
|  | 12 | // Third party headers: | 
|  | 13 | #include <map> | 
|  | 14 | #include <vector> | 
| Greg Clayton | ee3626e | 2015-01-20 00:04:26 +0000 | [diff] [blame] | 15 | #include "lldb/API/SBDebugger.h" | 
|  | 16 | #include "lldb/API/SBListener.h" | 
|  | 17 | #include "lldb/API/SBProcess.h" | 
|  | 18 | #include "lldb/API/SBTarget.h" | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 19 |  | 
|  | 20 | // In-house headers: | 
|  | 21 | #include "MICmnBase.h" | 
|  | 22 | #include "MIUtilSingletonBase.h" | 
|  | 23 | #include "MICmnLLDBDebugSessionInfoVarObj.h" | 
|  | 24 | #include "MICmnMIValueTuple.h" | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 25 | #include "MIUtilMapIdToVariant.h" | 
| Hafiz Abid Qadeer | d1f606f | 2015-02-04 09:59:23 +0000 | [diff] [blame] | 26 | #include "MIUtilThreadBaseStd.h" | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 27 |  | 
|  | 28 | // Declarations: | 
|  | 29 | class CMICmnLLDBDebugger; | 
|  | 30 | struct SMICmdData; | 
|  | 31 | class CMICmnMIValueTuple; | 
|  | 32 | class CMICmnMIValueList; | 
|  | 33 |  | 
|  | 34 | //++ ============================================================================ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 35 | // Details: MI debug session object that holds debugging information between | 
|  | 36 | //          instances of MI commands executing their work and producing MI | 
|  | 37 | //          result records. Information/data is set by one or many commands then | 
| Bruce Mitchener | ae4c026 | 2015-07-07 14:04:40 +0000 | [diff] [blame] | 38 | //          retrieved by the same or other subsequent commands. | 
|  | 39 | //          It primarily holds LLDB type objects. | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 40 | //          A singleton class. | 
|  | 41 | // Gotchas: None. | 
|  | 42 | // Authors: Illya Rudkin 04/03/2014. | 
|  | 43 | // Changes: None. | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 44 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 45 | class CMICmnLLDBDebugSessionInfo : public CMICmnBase, public MI::ISingleton<CMICmnLLDBDebugSessionInfo> | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 46 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 47 | friend class MI::ISingleton<CMICmnLLDBDebugSessionInfo>; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 48 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 49 | // Structs: | 
|  | 50 | public: | 
|  | 51 | //++ ============================================================================ | 
|  | 52 | // Details: Break point information object. Used to easily pass information about | 
|  | 53 | //          a break around and record break point information to be recalled by | 
|  | 54 | //          other commands or LLDB event handling functions. | 
|  | 55 | //-- | 
|  | 56 | struct SBrkPtInfo | 
|  | 57 | { | 
|  | 58 | SBrkPtInfo(void) | 
|  | 59 | : m_id(0) | 
|  | 60 | , m_bDisp(false) | 
|  | 61 | , m_bEnabled(false) | 
|  | 62 | , m_pc(0) | 
|  | 63 | , m_nLine(0) | 
|  | 64 | , m_bHaveArgOptionThreadGrp(false) | 
|  | 65 | , m_nTimes(0) | 
|  | 66 | , m_bPending(false) | 
|  | 67 | , m_nIgnore(0) | 
|  | 68 | , m_bCondition(false) | 
|  | 69 | , m_bBrkPtThreadId(false) | 
|  | 70 | , m_nBrkPtThreadId(0) | 
|  | 71 | { | 
|  | 72 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 73 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 74 | MIuint m_id;                    // LLDB break point ID. | 
|  | 75 | CMIUtilString m_strType;        // Break point type. | 
|  | 76 | bool m_bDisp;                   // True = "del", false = "keep". | 
|  | 77 | bool m_bEnabled;                // True = enabled, false = disabled break point. | 
| Ilia K | 7690fc5 | 2015-03-19 17:27:23 +0000 | [diff] [blame] | 78 | lldb::addr_t m_pc;              // Address number. | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 79 | CMIUtilString m_fnName;         // Function name. | 
|  | 80 | CMIUtilString m_fileName;       // File name text. | 
|  | 81 | CMIUtilString m_path;           // Full file name and path text. | 
|  | 82 | MIuint m_nLine;                 // File line number. | 
|  | 83 | bool m_bHaveArgOptionThreadGrp; // True = include MI field, false = do not include "thread-groups". | 
|  | 84 | CMIUtilString m_strOptThrdGrp;  // Thread group number. | 
|  | 85 | MIuint m_nTimes;                // The count of the breakpoint existence. | 
|  | 86 | CMIUtilString m_strOrigLoc;     // The name of the break point. | 
|  | 87 | bool m_bPending;                // True = the breakpoint has not been established yet, false = location found | 
|  | 88 | MIuint m_nIgnore;               // The number of time the breakpoint is run over before it is stopped on a hit | 
|  | 89 | bool m_bCondition;              // True = break point is conditional, use condition expression, false = no condition | 
|  | 90 | CMIUtilString m_strCondition;   // Break point condition expression | 
|  | 91 | bool m_bBrkPtThreadId;          // True = break point is specified to work with a specific thread, false = no specified thread given | 
|  | 92 | MIuint m_nBrkPtThreadId;        // Restrict the breakpoint to the specified thread-id | 
|  | 93 | }; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 94 |  | 
| Hafiz Abid Qadeer | 290ece8 | 2014-12-08 18:07:40 +0000 | [diff] [blame] | 95 | // Enumerations: | 
|  | 96 | public: | 
|  | 97 | //++ =================================================================== | 
|  | 98 | // Details: The type of variable used by MIResponseFormVariableInfo family functions. | 
|  | 99 | //-- | 
|  | 100 | enum VariableType_e | 
|  | 101 | { | 
|  | 102 | eVariableType_InScope   = (1u << 0), // In scope only. | 
|  | 103 | eVariableType_Statics   = (1u << 1), // Statics. | 
|  | 104 | eVariableType_Locals    = (1u << 2), // Locals. | 
|  | 105 | eVariableType_Arguments = (1u << 3)  // Arguments. | 
|  | 106 | }; | 
|  | 107 |  | 
| Ilia K | 1a0ec0f | 2015-02-06 18:08:24 +0000 | [diff] [blame] | 108 | //++ =================================================================== | 
|  | 109 | // Details: Determine the information that should be shown by using MIResponseFormVariableInfo family functions. | 
|  | 110 | //-- | 
|  | 111 | enum VariableInfoFormat_e | 
|  | 112 | { | 
| Ilia K | 25d29ba | 2015-05-15 11:55:09 +0000 | [diff] [blame] | 113 | eVariableInfoFormat_NoValues     = 0, | 
|  | 114 | eVariableInfoFormat_AllValues    = 1, | 
|  | 115 | eVariableInfoFormat_SimpleValues = 2 | 
| Ilia K | 1a0ec0f | 2015-02-06 18:08:24 +0000 | [diff] [blame] | 116 | }; | 
|  | 117 |  | 
| Ilia K | 5862732 | 2015-04-09 11:17:54 +0000 | [diff] [blame] | 118 | //++ =================================================================== | 
|  | 119 | // Details: Determine the information that should be shown by using MIResponseFormThreadInfo family functions. | 
|  | 120 | //-- | 
|  | 121 | enum ThreadInfoFormat_e | 
|  | 122 | { | 
|  | 123 | eThreadInfoFormat_NoFrames, | 
|  | 124 | eThreadInfoFormat_AllFrames | 
|  | 125 | }; | 
|  | 126 |  | 
|  | 127 | //++ =================================================================== | 
|  | 128 | // Details: Determine the information that should be shown by using MIResponseFormFrameInfo family functions. | 
|  | 129 | //-- | 
|  | 130 | enum FrameInfoFormat_e | 
|  | 131 | { | 
|  | 132 | eFrameInfoFormat_NoArguments, | 
|  | 133 | eFrameInfoFormat_AllArguments, | 
|  | 134 | eFrameInfoFormat_AllArgumentsInSimpleForm | 
|  | 135 | }; | 
|  | 136 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 137 | // Typedefs: | 
|  | 138 | public: | 
|  | 139 | typedef std::vector<uint32_t> VecActiveThreadId_t; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 140 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 141 | // Methods: | 
|  | 142 | public: | 
| Bruce Mitchener | 8820530 | 2015-07-06 15:48:55 +0000 | [diff] [blame] | 143 | bool Initialize(void) override; | 
|  | 144 | bool Shutdown(void) override; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 145 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 146 | // Variant type data which can be assigned and retrieved across all command instances | 
|  | 147 | template <typename T> bool SharedDataAdd(const CMIUtilString &vKey, const T &vData); | 
|  | 148 | template <typename T> bool SharedDataRetrieve(const CMIUtilString &vKey, T &vwData); | 
|  | 149 | bool SharedDataDestroy(void); | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 150 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 151 | //  Common command required functionality | 
|  | 152 | bool AccessPath(const CMIUtilString &vPath, bool &vwbYesAccessible); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 153 | bool ResolvePath(const SMICmdData &vCmdData, const CMIUtilString &vPath, CMIUtilString &vwrResolvedPath); | 
|  | 154 | bool ResolvePath(const CMIUtilString &vstrUnknown, CMIUtilString &vwrResolvedPath); | 
| Ilia K | 5862732 | 2015-04-09 11:17:54 +0000 | [diff] [blame] | 155 | bool MIResponseFormFrameInfo(const lldb::SBThread &vrThread, const MIuint vnLevel, | 
|  | 156 | const FrameInfoFormat_e veFrameInfoFormat, CMICmnMIValueTuple &vwrMiValueTuple); | 
|  | 157 | bool MIResponseFormThreadInfo(const SMICmdData &vCmdData, const lldb::SBThread &vrThread, | 
|  | 158 | const ThreadInfoFormat_e veThreadInfoFormat, CMICmnMIValueTuple &vwrMIValueTuple); | 
| Ilia K | 1a0ec0f | 2015-02-06 18:08:24 +0000 | [diff] [blame] | 159 | bool MIResponseFormVariableInfo(const lldb::SBFrame &vrFrame, const MIuint vMaskVarTypes, | 
| Ilia K | 5862732 | 2015-04-09 11:17:54 +0000 | [diff] [blame] | 160 | const VariableInfoFormat_e veVarInfoFormat, CMICmnMIValueList &vwrMiValueList, | 
| Hafiz Abid Qadeer | fda237d | 2015-04-29 08:18:41 +0000 | [diff] [blame] | 161 | const MIuint vnMaxDepth = 10, const bool vbMarkArgs = false); | 
| Bruce Mitchener | 2c674d3 | 2015-07-22 17:07:27 +0000 | [diff] [blame^] | 162 | void MIResponseFormBrkPtFrameInfo(const SBrkPtInfo &vrBrkPtInfo, CMICmnMIValueTuple &vwrMiValueTuple); | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 163 | bool MIResponseFormBrkPtInfo(const SBrkPtInfo &vrBrkPtInfo, CMICmnMIValueTuple &vwrMiValueTuple); | 
|  | 164 | bool GetBrkPtInfo(const lldb::SBBreakpoint &vBrkPt, SBrkPtInfo &vrwBrkPtInfo) const; | 
|  | 165 | bool RecordBrkPtInfo(const MIuint vnBrkPtId, const SBrkPtInfo &vrBrkPtInfo); | 
|  | 166 | bool RecordBrkPtInfoGet(const MIuint vnBrkPtId, SBrkPtInfo &vrwBrkPtInfo) const; | 
|  | 167 | bool RecordBrkPtInfoDelete(const MIuint vnBrkPtId); | 
| Hafiz Abid Qadeer | d1f606f | 2015-02-04 09:59:23 +0000 | [diff] [blame] | 168 | CMIUtilThreadMutex& GetSessionMutex() { return m_sessionMutex;} | 
| Hafiz Abid Qadeer | 0d51c15 | 2015-02-03 10:05:54 +0000 | [diff] [blame] | 169 | lldb::SBDebugger &GetDebugger() const; | 
|  | 170 | lldb::SBListener &GetListener() const; | 
|  | 171 | lldb::SBTarget GetTarget() const; | 
|  | 172 | lldb::SBProcess GetProcess() const; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 173 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 174 | // Attributes: | 
|  | 175 | public: | 
|  | 176 | // The following are available to all command instances | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 177 | const MIuint m_nBrkPointCntMax; | 
|  | 178 | VecActiveThreadId_t m_vecActiveThreadId; | 
|  | 179 | lldb::tid_t m_currentSelectedThread; | 
|  | 180 |  | 
|  | 181 | // These are keys that can be used to access the shared data map | 
|  | 182 | // Note: This list is expected to grow and will be moved and abstracted in the future. | 
|  | 183 | const CMIUtilString m_constStrSharedDataKeyWkDir; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 184 | const CMIUtilString m_constStrSharedDataSolibPath; | 
| Ilia K | aa82b4a | 2015-04-25 19:44:56 +0000 | [diff] [blame] | 185 | const CMIUtilString m_constStrPrintCharArrayAsString; | 
| Ilia K | 81bd06d | 2015-04-25 20:10:02 +0000 | [diff] [blame] | 186 | const CMIUtilString m_constStrPrintExpandAggregates; | 
| Ilia K | 94b8ebc | 2015-04-25 20:33:02 +0000 | [diff] [blame] | 187 | const CMIUtilString m_constStrPrintAggregateFieldNames; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 188 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 189 | // Typedefs: | 
|  | 190 | private: | 
|  | 191 | typedef std::vector<CMICmnLLDBDebugSessionInfoVarObj> VecVarObj_t; | 
|  | 192 | typedef std::map<MIuint, SBrkPtInfo> MapBrkPtIdToBrkPtInfo_t; | 
|  | 193 | typedef std::pair<MIuint, SBrkPtInfo> MapPairBrkPtIdToBrkPtInfo_t; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 194 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 195 | // Methods: | 
|  | 196 | private: | 
|  | 197 | /* ctor */ CMICmnLLDBDebugSessionInfo(void); | 
|  | 198 | /* ctor */ CMICmnLLDBDebugSessionInfo(const CMICmnLLDBDebugSessionInfo &); | 
|  | 199 | void operator=(const CMICmnLLDBDebugSessionInfo &); | 
|  | 200 | // | 
| Ilia K | 5862732 | 2015-04-09 11:17:54 +0000 | [diff] [blame] | 201 | bool GetVariableInfo(const lldb::SBValue &vrValue, const bool vbInSimpleForm, CMIUtilString &vwrStrValue); | 
|  | 202 | bool GetFrameInfo(const lldb::SBFrame &vrFrame, lldb::addr_t &vwPc, CMIUtilString &vwFnName, CMIUtilString &vwFileName, | 
|  | 203 | CMIUtilString &vwPath, MIuint &vwnLine); | 
|  | 204 | bool GetThreadFrames(const SMICmdData &vCmdData, const MIuint vThreadIdx, const FrameInfoFormat_e veFrameInfoFormat, | 
|  | 205 | CMIUtilString &vwrThreadFrames); | 
| Hafiz Abid Qadeer | fda237d | 2015-04-29 08:18:41 +0000 | [diff] [blame] | 206 | bool MIResponseForVariableInfoInternal(const VariableInfoFormat_e veVarInfoFormat, CMICmnMIValueList &vwrMiValueList, | 
|  | 207 | const lldb::SBValueList &vwrSBValueList, const MIuint vnMaxDepth, const bool vbIsArgs, const bool vbMarkArgs); | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 208 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 209 | // Overridden: | 
|  | 210 | private: | 
|  | 211 | // From CMICmnBase | 
| Bruce Mitchener | 8820530 | 2015-07-06 15:48:55 +0000 | [diff] [blame] | 212 | /* dtor */ ~CMICmnLLDBDebugSessionInfo(void) override; | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 213 |  | 
|  | 214 | // Attributes: | 
|  | 215 | private: | 
|  | 216 | CMIUtilMapIdToVariant m_mapIdToSessionData; // Hold and retrieve key to value data available across all commands | 
|  | 217 | VecVarObj_t m_vecVarObj;                    // Vector of session variable objects | 
|  | 218 | MapBrkPtIdToBrkPtInfo_t m_mapBrkPtIdToBrkPtInfo; | 
| Hafiz Abid Qadeer | d1f606f | 2015-02-04 09:59:23 +0000 | [diff] [blame] | 219 | CMIUtilThreadMutex m_sessionMutex; | 
| Deepak Panickal | 6f9c468 | 2014-05-16 10:51:01 +0000 | [diff] [blame] | 220 | }; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 221 |  | 
|  | 222 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 223 | // Details: Command instances can create and share data between other instances of commands. | 
|  | 224 | //          This function adds new data to the shared data. Using the same ID more than | 
|  | 225 | //          once replaces any previous matching data keys. | 
|  | 226 | // Type:    Template method. | 
|  | 227 | // Args:    T       - The type of the object to be stored. | 
|  | 228 | //          vKey    - (R) A non empty unique data key to retrieve the data by. | 
|  | 229 | //          vData   - (R) Data to be added to the share. | 
|  | 230 | // Return:  MIstatus::success - Functional succeeded. | 
|  | 231 | //          MIstatus::failure - Functional failed. | 
|  | 232 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 233 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 234 | template <typename T> | 
|  | 235 | bool | 
|  | 236 | CMICmnLLDBDebugSessionInfo::SharedDataAdd(const CMIUtilString &vKey, const T &vData) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 237 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 238 | if (!m_mapIdToSessionData.Add<T>(vKey, vData)) | 
|  | 239 | { | 
|  | 240 | SetErrorDescription(m_mapIdToSessionData.GetErrorDescription()); | 
|  | 241 | return MIstatus::failure; | 
|  | 242 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 243 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 244 | return MIstatus::success; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 245 | } | 
|  | 246 |  | 
|  | 247 | //++ ------------------------------------------------------------------------------------ | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 248 | // Details: Command instances can create and share data between other instances of commands. | 
|  | 249 | //          This function retrieves data from the shared data container. | 
|  | 250 | // Type:    Method. | 
|  | 251 | // Args:    T     - The type of the object being retrieved. | 
|  | 252 | //          vKey  - (R) A non empty unique data key to retrieve the data by. | 
|  | 253 | //          vData - (W) The data. | 
|  | 254 | // Return:  bool  - True = data found, false = data not found or an error occurred trying to fetch. | 
|  | 255 | // Throws:  None. | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 256 | //-- | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 257 | template <typename T> | 
|  | 258 | bool | 
|  | 259 | CMICmnLLDBDebugSessionInfo::SharedDataRetrieve(const CMIUtilString &vKey, T &vwData) | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 260 | { | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 261 | bool bDataFound = false; | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 262 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 263 | if (!m_mapIdToSessionData.Get<T>(vKey, vwData, bDataFound)) | 
|  | 264 | { | 
|  | 265 | SetErrorDescription(m_mapIdToSessionData.GetErrorDescription()); | 
|  | 266 | return MIstatus::failure; | 
|  | 267 | } | 
| Deepak Panickal | 877569c | 2014-06-24 16:35:50 +0000 | [diff] [blame] | 268 |  | 
| Zachary Turner | 1d6af02 | 2014-11-17 18:06:21 +0000 | [diff] [blame] | 269 | return bDataFound; | 
|  | 270 | } |