Submit protocol of social share plugin

This commit is contained in:
lihex 2013-04-24 15:58:57 +08:00
parent 1af72075bc
commit 4e24ce40ea
4 changed files with 270 additions and 0 deletions

View File

@ -0,0 +1,89 @@
#ifndef __CXX_PROTOCOL_SOCIAL_H__
#define __CXX_PROTOCOL_SOCIAL_H__
#include "PluginProtocol.h"
#include <map>
#include <string>
namespace cocos2d { namespace plugin {
typedef std::map<std::string, std::string> TDeveloperInfo;
typedef std::map<std::string, std::string> TShareInfo;
typedef enum
{
eShareSuccess = 0,
eShareFail,
eShareCancel,
eShareTimeOut,
} EShareResult;
class ShareResultListener
{
public:
virtual void shareResult(EShareResult ret, const char* msg, TShareInfo info) = 0;
};
class ProtocolSocial : public PluginProtocol
{
public:
/**
@brief plugin initialization
*/
virtual bool init();
/**
@brief initialize the developer info
@param devInfo This parameter is the info of developer,
different plugin have different format
@warning Must invoke this interface before other interfaces.
And invoked only once.
*/
virtual void initDeveloperInfo(TDeveloperInfo devInfo);
/**
@brief share information
@param info The info of share, must contains key:
text The text of share
@warning For different plugin, the parameter should have other keys to share.
Look at the manual of plugins.
*/
virtual void share(TShareInfo info);
/**
@brief Set whether needs to output logs to console.
@param debug if true debug mode enabled, or debug mode disabled.
*/
virtual void setDebugMode(bool debug);
/**
@breif set the result listener
@param pListener The callback object for share result
@wraning Must invoke this interface before share
*/
static void setResultListener(ShareResultListener* pListener);
/**
@brief share result callback
*/
static void shareResult(EShareResult ret, const char* msg);
virtual const char* getPluginVersion() { return "ProtocolSocial, v0.1.00 , subclass should override this interface!"; };
virtual const char* getSDKVersion();
virtual const char* getPluginName() = 0;
protected:
ProtocolSocial();
public:
virtual ~ProtocolSocial();
protected:
static bool m_bSharing;
static ShareResultListener* m_pListener;
static TShareInfo m_curInfo;
};
}} // namespace cocos2d { namespace plugin {
#endif /* ----- #ifndef __CXX_PROTOCOL_SOCIAL_H__ ----- */

View File

@ -0,0 +1,151 @@
#include "ProtocolSocial.h"
#include "PluginJniHelper.h"
#include <android/log.h>
#include "PluginUtils.h"
#include "PluginJavaData.h"
#if 1
#define LOG_TAG "ProtocolSocial"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#else
#define LOGD(...)
#endif
namespace cocos2d { namespace plugin {
extern "C" {
JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_InterfaceSocial_nativeShareResult(JNIEnv* env, jobject thiz, jint ret, jstring msg)
{
std::string strMsg = PluginJniHelper::jstring2string(msg);
ProtocolSocial::shareResult((EShareResult) ret, strMsg.c_str());
}
}
bool ProtocolSocial::m_bSharing = false;
ShareResultListener* ProtocolSocial::m_pListener = NULL;
TShareInfo ProtocolSocial::m_curInfo;
ProtocolSocial::ProtocolSocial()
{
}
ProtocolSocial::~ProtocolSocial()
{
PluginUtils::erasePluginJavaData(this);
}
bool ProtocolSocial::init()
{
return true;
}
void ProtocolSocial::initDeveloperInfo(TDeveloperInfo devInfo)
{
if (devInfo.empty())
{
LOGD("The developer info is empty!");
return;
}
else
{
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
PluginJniMethodInfo t;
if (PluginJniHelper::getMethodInfo(t
, pData->jclassName.c_str()
, "initDeveloperInfo"
, "(Ljava/util/Hashtable;)V"))
{
// generate the hashtable from map
jobject obj_Map = PluginUtils::createJavaMapObject(t, &devInfo);
// invoke java method
t.env->CallVoidMethod(pData->jobj, t.methodID, obj_Map);
t.env->DeleteLocalRef(obj_Map);
t.env->DeleteLocalRef(t.classID);
}
}
}
void ProtocolSocial::share(TShareInfo info)
{
if (m_bSharing)
{
LOGD("Now is sharing");
return;
}
if (info.empty())
{
if (NULL != m_pListener)
{
shareResult(eShareFail, "Share info error");
}
LOGD("The Share info is empty!");
return;
}
else
{
m_bSharing = true;
m_curInfo = info;
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
PluginJniMethodInfo t;
if (PluginJniHelper::getMethodInfo(t
, pData->jclassName.c_str()
, "share"
, "(Ljava/util/Hashtable;)V"))
{
// generate the hashtable from map
jobject obj_Map = PluginUtils::createJavaMapObject(t, &info);
// invoke java method
t.env->CallVoidMethod(pData->jobj, t.methodID, obj_Map);
t.env->DeleteLocalRef(obj_Map);
t.env->DeleteLocalRef(t.classID);
}
}
}
void ProtocolSocial::setResultListener(ShareResultListener* pListener)
{
m_pListener = pListener;
}
void ProtocolSocial::shareResult(EShareResult ret, const char* msg)
{
m_bSharing = false;
if (m_pListener)
{
m_pListener->shareResult(ret, msg, m_curInfo);
}
else
{
LOGD("Result listener is null!");
}
m_curInfo.clear();
LOGD("Share result is : %d(%s)", (int) ret, msg);
}
const char* ProtocolSocial::getSDKVersion()
{
std::string verName;
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
PluginJniMethodInfo t;
if (PluginJniHelper::getMethodInfo(t
, pData->jclassName.c_str()
, "getSDKVersion"
, "()Ljava/lang/String;"))
{
jstring ret = (jstring)(t.env->CallObjectMethod(pData->jobj, t.methodID));
verName = PluginJniHelper::jstring2string(ret);
}
return verName.c_str();
}
void ProtocolSocial::setDebugMode(bool debug)
{
PluginUtils::callJavaFunctionWithName_oneBaseType(this, "setDebugMode", "(Z)V", debug);
}
}} // namespace cocos2d { namespace plugin {

1
plugin/protocols/proj.android/jni/Android.mk Normal file → Executable file
View File

@ -13,6 +13,7 @@ $(addprefix ../../platform/android/, \
ProtocolAnalytics.cpp \
ProtocolIAP.cpp \
ProtocolAds.cpp \
ProtocolSocial.cpp \
) \
../../PluginManager.cpp \
../../RegisterPlugin.cpp \

View File

@ -0,0 +1,29 @@
package org.cocos2dx.plugin;
import java.util.Hashtable;
public class InterfaceSocial {
public static final int SHARERESULT_SUCCESS = 0;
public static final int SHARERESULT_FAIL = 1;
public static final int SHARERESULT_CANCEL = 2;
public static final int SHARERESULT_TIMEOUT = 3;
public interface ShareAdapter {
public void initDeveloperInfo(Hashtable<String, String> cpInfo);
public void share(Hashtable<String, String> cpInfo);
public void setDebugMode(boolean debug);
public String getSDKVersion();
}
public static void shareResult(int ret, String msg) {
final int curRet = ret;
final String curMsg = msg;
PluginWrapper.runOnGLThread(new Runnable() {
@Override
public void run() {
nativeShareResult(curRet, curMsg);
}
});
}
private static native void nativeShareResult(int ret, String msg);
}