summaryrefslogtreecommitdiffstats
path: root/lib/CommLayer
diff options
context:
space:
mode:
authorZdenek Prikryl <zprikryl@redhat.com>2009-05-26 07:53:47 +0200
committerZdenek Prikryl <zprikryl@redhat.com>2009-05-26 07:53:47 +0200
commita48878402d1bb9121880b1bdf19624ae5ac12f6a (patch)
tree5ca643449ed04b3605e5e70a0924794eab70032f /lib/CommLayer
parent49c068355242a184b7481f0818ad7ec5a2067916 (diff)
downloadabrt-a48878402d1bb9121880b1bdf19624ae5ac12f6a.tar.gz
abrt-a48878402d1bb9121880b1bdf19624ae5ac12f6a.tar.xz
abrt-a48878402d1bb9121880b1bdf19624ae5ac12f6a.zip
types for socket communication
Diffstat (limited to 'lib/CommLayer')
-rw-r--r--lib/CommLayer/SocketCrashTypes.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/lib/CommLayer/SocketCrashTypes.h b/lib/CommLayer/SocketCrashTypes.h
new file mode 100644
index 00000000..cf5f9dd9
--- /dev/null
+++ b/lib/CommLayer/SocketCrashTypes.h
@@ -0,0 +1,141 @@
+#ifndef SOCKETCRASHTYPES_H_
+#define SOCKETCRASHTYPES_H_
+
+#include "CrashTypes.h"
+#include <sstream>
+#include <stdlib.h>
+
+inline std::string crash_data_to_string(const map_crash_data_t& pCrashData)
+{
+ std::stringstream sCD;
+ map_crash_data_t::const_iterator it_cd;
+ sCD << "(" << pCrashData.size() << ")";
+ for(it_cd = pCrashData.begin(); it_cd != pCrashData.end(); it_cd++)
+ {
+ sCD << "(" << it_cd->first.length() << ")";
+ sCD << it_cd->first;
+ sCD << "(" << it_cd->second[CD_TYPE].length() << ")";
+ sCD << it_cd->second[CD_TYPE];
+ sCD << "(" << it_cd->second[CD_EDITABLE].length() << ")";
+ sCD << it_cd->second[CD_EDITABLE];
+ sCD << "(" << it_cd->second[CD_CONTENT].length() << ")";
+ sCD << it_cd->second[CD_CONTENT];
+ }
+ return sCD.str();
+}
+
+inline std::string crash_infos_to_string(const vector_crash_infos_t& pCrashInfos)
+{
+ std::stringstream sCI;
+ unsigned int ii;
+ for (ii = 0; ii < pCrashInfos.size(); ii++)
+ {
+ sCI << crash_data_to_string(pCrashInfos[ii]);
+ }
+ return sCI.str();
+}
+
+inline std::string crash_report_to_string(const map_crash_report_t& pCrashReport)
+{
+ return crash_data_to_string(pCrashReport);
+}
+
+inline int get_number_from_string(const std::string& pMessage, int& len)
+{
+ std::string sNumber = "";
+
+ int ii = 1;
+ while (pMessage[ii] != ')')
+ {
+ sNumber += pMessage[ii];
+ ii++;
+ if (static_cast<std::string::size_type>(ii) >= pMessage.length())
+ {
+ len = ii;
+ return -1;
+ }
+ }
+ len = ii + 1;
+ return atoi(sNumber.c_str());
+}
+
+inline map_crash_data_t string_to_crash_data(const std::string& pMessage, int& len)
+{
+ map_crash_data_t ci;
+ std::string message = pMessage;
+ int nSize;
+ std::string sField;
+ int nField;
+ int nCount;
+ std::string name;
+ int ii;
+
+ nCount = get_number_from_string(message, ii);
+ if (ii == -1)
+ {
+ len = ii;
+ return ci;
+ }
+ message.erase(0, ii);
+ len = ii;
+ nField = 0;
+ while (nField < nCount * 4)
+ {
+ nSize = get_number_from_string(message, ii);
+ if (ii == -1)
+ {
+ len += ii;
+ ci.clear();
+ return ci;
+ }
+ sField = message.substr(ii, nSize);
+ message.erase(0, ii + nSize);
+ len += ii + nSize;
+ switch(nField % 4)
+ {
+ case 0:
+ name = sField;
+ break;
+ default:
+ ci[name].push_back(sField);
+ break;
+ }
+ nField++;
+ }
+ return ci;
+}
+
+inline vector_crash_infos_t string_to_crash_infos(const std::string& pMessage)
+{
+ vector_crash_infos_t vci;
+ std::string message = pMessage;
+ int len;
+
+ if (!message.compare(0, sizeof("(CRASH_INFOS)"), "(CRASH_INFOS)"))
+ {
+ return vci;
+ }
+ message.erase(0, sizeof("(CRASH_INFOS)") - 1);
+
+ while (message != "")
+ {
+ map_crash_info_t crash_info = string_to_crash_data(message, len);
+ if (crash_info.size() == 0)
+ {
+ return vci;
+ }
+ vci.push_back(crash_info);
+ message.erase(0, len);
+ }
+ return vci;
+}
+
+inline map_crash_report_t string_to_crash_report(const std::string& pMessage)
+{
+ int len;
+
+ map_crash_report_t crash_report = string_to_crash_data(pMessage, len);
+ return crash_report;
+}
+
+#endif /* SOCKETCRASHTYPES_H_ */