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

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_MESSAGE_ID_LENGTH 256
#define MAX_TOPIC_LENGTH 512
#define MAX_BROKER_NAME_ID_LENGTH 256
typedef enum _CStatus_ {
  // Success
  OK = 0,
  // Failed, null pointer value
  NULL_POINTER = 1,
  MALLOC_FAILED = 2,
  PRODUCER_ERROR_CODE_START = 10,
  PRODUCER_START_FAILED = 10,
  PRODUCER_SEND_SYNC_FAILED = 11,
  PRODUCER_SEND_ONEWAY_FAILED = 12,
  PRODUCER_SEND_ORDERLY_FAILED = 13,
  PRODUCER_SEND_ASYNC_FAILED = 14,
  PRODUCER_SEND_ORDERLYASYNC_FAILED = 15,

  PUSHCONSUMER_ERROR_CODE_START = 20,
  PUSHCONSUMER_START_FAILED = 20,

  PULLCONSUMER_ERROR_CODE_START = 30,
  PULLCONSUMER_START_FAILED = 30,
  PULLCONSUMER_FETCH_MQ_FAILED = 31,
  PULLCONSUMER_FETCH_MESSAGE_FAILED = 32
} CStatus;

typedef enum _CLogLevel_ {
  E_LOG_LEVEL_FATAL = 1,
  E_LOG_LEVEL_ERROR = 2,
  E_LOG_LEVEL_WARN = 3,
  E_LOG_LEVEL_INFO = 4,
  E_LOG_LEVEL_DEBUG = 5,
  E_LOG_LEVEL_TRACE = 6,
  E_LOG_LEVEL_LEVEL_NUM = 7
} CLogLevel;

#ifdef WIN32
#ifdef ROCKETMQCLIENT_EXPORTS
#ifdef _WINDLL
#define ROCKETMQCLIENT_API __declspec(dllexport)
#else
#define ROCKETMQCLIENT_API
#endif
#else
#ifdef ROCKETMQCLIENT_IMPORT
#define ROCKETMQCLIENT_API __declspec(dllimport)
#else
#define ROCKETMQCLIENT_API
#endif
#endif
#else
#define ROCKETMQCLIENT_API
#endif

typedef enum _CMessageModel_ { BROADCASTING, CLUSTERING } CMessageModel;

#ifdef __cplusplus
};
#endif
#endif  //__C_COMMON_H__
