You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tubemq.apache.org by gx...@apache.org on 2020/07/03 13:42:37 UTC
[incubator-tubemq] 01/02: [TUBEMQ-267]Create C/C++ Message class
(#182)
This is an automated email from the ASF dual-hosted git repository.
gxcheng pushed a commit to branch tubemq-client-cpp
in repository https://gitbox.apache.org/repos/asf/incubator-tubemq.git
commit a7d43f49afde4e0ec4c79493847e07ca2d36da9d
Author: gosonzhang <go...@tencent.com>
AuthorDate: Fri Jul 3 21:38:50 2020 +0800
[TUBEMQ-267]Create C/C++ Message class (#182)
---
.../tubemq-client-cpp/inc/message.h | 78 +++++++
.../tubemq-client-cpp/src/message.cc | 249 +++++++++++++++++++++
2 files changed, 327 insertions(+)
diff --git a/tubemq-client-twins/tubemq-client-cpp/inc/message.h b/tubemq-client-twins/tubemq-client-cpp/inc/message.h
new file mode 100644
index 0000000..20d7fcf
--- /dev/null
+++ b/tubemq-client-twins/tubemq-client-cpp/inc/message.h
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef _TUBEMQ_CLIENT_MESSAGE_H_
+#define _TUBEMQ_CLIENT_MESSAGE_H_
+
+
+#include <list>
+#include <map>
+#include <string>
+#include <stdio.h>
+
+
+namespace tubemq {
+
+using namespace std;
+
+class Message {
+ public:
+ Message();
+ Message(const Message& target);
+ Message(const string& topic, const char* data, int datalen);
+ virtual ~Message();
+ Message& operator=(const Message& target);
+ const long GetMessageId() const;
+ void SetMessageId(long message_id);
+ const string& GetTopic() const;
+ void SetTopic(const string& topic);
+ const char* GetData() const;
+ int GetDataLength() const;
+ void setData(const char* data, int datalen);
+ const int GetFlag() const;
+ void SetFlag(int flag);
+ const map<string, string>& GetProperties() const;
+ int GetProperties(string& attribute);
+ bool HasProperty(const string& key);
+ bool GetProperty(const string& key, string& value);
+ bool GetFilterItem(string& value);
+ bool AddProperty(string& err_info, const string& key, const string& value);
+
+ private:
+ void clearData();
+ void copyData(const char* data, int datalen);
+ void copyProperties(const map<string, string>& properties);
+
+
+ private:
+ string topic_;
+ char* data_;
+ int datalen_;
+ long message_id_;
+ int flag_;
+ map<string, string> properties_;
+};
+
+}
+
+
+
+
+#endif
+
diff --git a/tubemq-client-twins/tubemq-client-cpp/src/message.cc b/tubemq-client-twins/tubemq-client-cpp/src/message.cc
new file mode 100644
index 0000000..c5162e3
--- /dev/null
+++ b/tubemq-client-twins/tubemq-client-cpp/src/message.cc
@@ -0,0 +1,249 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <sstream>
+#include <string.h>
+
+#include "message.h"
+#include "utils.h"
+#include "const_config.h"
+
+
+namespace tubemq {
+
+
+// message flag's properties settings
+static const int kMsgFlagIncProperties = 0x01;
+// reserved property key Filter Item
+static const string kRsvPropKeyFilterItem = "$msgType$";
+// reserved property key message send time
+static const string kRsvPropKeyMsgTime = "$msgTime$";
+
+
+Message::Message() {
+ this->topic_ = "";
+ this->flag_ = 0;
+ this->message_id_ = config::kInvalidValue;
+ this->data_ = NULL;
+ this->datalen_ = 0;
+ this->properties_.clear();
+}
+
+Message::Message(const Message& target) {
+ this->topic_ = target.topic_;
+ this->message_id_ = target.message_id_;
+ copyData(target.data_, target.datalen_);
+ copyProperties(target.properties_);
+ this->flag_ = target.flag_;
+}
+
+Message::Message(const string& topic, const char* data, int datalen) {
+ this->topic_ = topic;
+ this->flag_ = 0;
+ this->message_id_ = config::kInvalidValue;
+ copyData(data, datalen);
+ this->properties_.clear();
+}
+
+Message::~Message() {
+ clearData();
+}
+
+Message& Message::operator=(const Message& target) {
+ if (this == &target)
+ return *this;
+ this->topic_ = target.topic_;
+ this->message_id_ = target.message_id_;
+ clearData();
+ copyData(target.data_, target.datalen_);
+ copyProperties(target.properties_);
+ this->flag_ = target.flag_;
+ return *this;
+}
+
+const long Message::GetMessageId() const {
+ return this->message_id_;
+}
+
+void Message::SetMessageId(long message_id) {
+ this->message_id_ = message_id;
+}
+
+const string& Message::GetTopic() const {
+ return this->topic_;
+}
+
+void Message::SetTopic(const string& topic) {
+ this->topic_ = topic;
+}
+
+const char* Message::GetData() const {
+ return this->data_;
+}
+
+int Message::GetDataLength() const {
+ return this->datalen_;
+}
+
+void Message::setData(const char* data, int datalen) {
+ clearData();
+ copyData(data, datalen);
+}
+
+const int Message::GetFlag() const {
+ return this->flag_;
+}
+
+void Message::SetFlag(int flag) {
+ this->flag_ = flag;
+}
+
+const map<string, string>& Message::GetProperties() const {
+ return this->properties_;
+}
+
+int Message::GetProperties(string& attribute) {
+ attribute.clear();
+ map<string, string>::iterator it_map;
+ for (it_map = this->properties_.begin(); it_map != this->properties_.end(); ++it_map) {
+ if (!attribute.empty()) {
+ attribute += delimiter::kDelimiterComma;
+ }
+ attribute += it_map->first;
+ attribute += delimiter::kDelimiterEqual;
+ attribute += it_map->second;
+ }
+ return attribute.length();
+}
+
+bool Message::HasProperty(const string& key) {
+ map<string, string>::iterator it_map;
+ string trimed_key = Utils::Trim(key);
+ if (!trimed_key.empty()) {
+ it_map = this->properties_.find(trimed_key);
+ if (it_map != this->properties_.end()) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool Message::GetProperty(const string& key, string& value) {
+ map<string, string>::iterator it_map;
+ string trimed_key = Utils::Trim(key);
+ if (!trimed_key.empty()) {
+ it_map = this->properties_.find(trimed_key);
+ if (it_map != this->properties_.end()) {
+ value = it_map->second;
+ return true;
+ }
+ }
+ return false;
+}
+
+bool Message::GetFilterItem(string& value) {
+ return GetProperty(kRsvPropKeyFilterItem, value);
+}
+
+bool Message::AddProperty(string& err_info, const string& key, const string& value) {
+ string trimed_key = Utils::Trim(key);
+ string trimed_value = Utils::Trim(value);
+ if (trimed_key.empty() || trimed_value.empty()) {
+ err_info = "Not allowed null value of parmeter key or value";
+ return false;
+ }
+ if ((string::npos != trimed_key.find(delimiter::kDelimiterComma))
+ ||(string::npos != trimed_key.find(delimiter::kDelimiterEqual))) {
+ stringstream ss;
+ ss << "Reserved token '";
+ ss << delimiter::kDelimiterComma;
+ ss << "' or '";
+ ss << delimiter::kDelimiterEqual;
+ ss << "' in parmeter key!";
+ err_info = ss.str();
+ return false;
+ }
+ if ((string::npos != trimed_value.find(delimiter::kDelimiterComma))
+ ||(string::npos != trimed_value.find(delimiter::kDelimiterEqual))) {
+ stringstream ss;
+ ss << "Reserved token '";
+ ss << delimiter::kDelimiterComma;
+ ss << "' or '";
+ ss << delimiter::kDelimiterEqual;
+ ss << "' in parmeter value!";
+ err_info = ss.str();
+ return false;
+ }
+ if(trimed_key == kRsvPropKeyFilterItem
+ || trimed_key == kRsvPropKeyMsgTime) {
+ stringstream ss;
+ ss << "Reserved token '";
+ ss << kRsvPropKeyFilterItem;
+ ss << "' or '";
+ ss << kRsvPropKeyMsgTime;
+ ss << "' must not be used in parmeter key!";
+ err_info = ss.str();
+ return false;
+ }
+ // add key and value
+ this->properties_[trimed_key] = trimed_value;
+ if (!this->properties_.empty()) {
+ this->flag_ |= kMsgFlagIncProperties;
+ }
+ err_info = "Ok";
+ return true;
+}
+
+void Message::clearData() {
+ if (this->data_ != NULL) {
+ delete[] this->data_;
+ this->data_ = NULL;
+ this->datalen_ = 0;
+ }
+}
+
+void Message::copyData(const char* data, int datalen) {
+ if (data == NULL) {
+ this->data_ = NULL;
+ this->datalen_ = 0;
+ } else {
+ this->datalen_ = datalen;
+ this->data_ = new char[datalen];
+ memset(this->data_, 0, datalen);
+ memcpy(this->data_, data, datalen);
+ }
+}
+
+void Message::copyProperties(const map<string, string>& properties) {
+ this->properties_.clear();
+ map<string, string>::const_iterator it_map;
+ for (it_map = properties.begin(); it_map != properties.end(); ++it_map) {
+ this->properties_[it_map->first] = it_map->second;
+ }
+ if (!this->properties_.empty()) {
+ this->flag_ |= kMsgFlagIncProperties;
+ }
+}
+
+
+}
+
+
+
+