/*
 * 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 ROCKETMQ_ONS_CPP_CCONST_H
#define ROCKETMQ_ONS_CPP_CCONST_H

#endif //ROCKETMQ_ONS_CPP_CCONST_H
#ifdef __cplusplus
extern "C" {
#endif
#define CAPI_PROPERTY_KEYS "KEYS"
#define CAPI_PROPERTY_TAGS  "TAGS"
#define CAPI_PROPERTY_WAIT_STORE_MSG_OK  "WAIT"
#define CAPI_PROPERTY_DELAY_TIME_LEVEL  "DELAY"
#define CAPI_PROPERTY_RETRY_TOPIC  "RETRY_TOPIC"
#define CAPI_PROPERTY_REAL_TOPIC  "REAL_TOPIC"
#define CAPI_PROPERTY_REAL_QUEUE_ID  "REAL_QID"
#define CAPI_PROPERTY_TRANSACTION_PREPARED  "TRAN_MSG"
#define CAPI_PROPERTY_PRODUCER_GROUP  "PGROUP"
#define CAPI_PROPERTY_MIN_OFFSET  "MIN_OFFSET"
#define CAPI_PROPERTY_MAX_OFFSET  "MAX_OFFSET"
#define CAPI_PROPERTY_ORIGIN_MESSAGE_ID  "ORIGIN_MESSAGE_ID"
#define CAPI_PROPERTY_TRANSFER_FLAG  "TRANSFER_FLAG"
#define CAPI_PROPERTY_CORRECTION_FLAG  "CORRECTION_FLAG"
#define CAPI_PROPERTY_MQ2_FLAG  "MQ2_FLAG"
#define CAPI_PROPERTY_RECONSUME_TIME  "RECONSUME_TIME"
#define CAPI_PROPERTY_MSG_REGION  "MSG_REGION"
#define CAPI_PROPERTY_TRACE_SWITCH  "TRACE_ON"
#define CAPI_PROPERTY_UNIQ_CLIENT_MESSAGE_ID_KEYIDX  "UNIQ_KEY"
#define CAPI_PROPERTY_MAX_RECONSUME_TIMES  "MAX_RECONSUME_TIMES"
#define CAPI_PROPERTY_CONSUME_START_TIMESTAMP  "CONSUME_START_TIME"
#define CAPI_PROPERTY_TRANSACTION_PREPARED_QUEUE_OFFSET  "TRAN_PREPARED_QUEUE_OFFSET"
#define CAPI_PROPERTY_TRANSACTION_CHECK_TIMES  "TRANSACTION_CHECK_TIMES"
#define CAPI_PROPERTY_CHECK_IMMUNITY_TIME_IN_SECONDS  "CHECK_IMMUNITY_TIME_IN_SECONDS"

#ifdef __cplusplus
};
#endif