技术标签: linphone
private native void finalize(long nativePtr);
private native long newLinphoneFriend(String friendUri);
private native void setAddress(long nativePtr,long friend);
private native long getAddress(long nativePtr);
private native void setIncSubscribePolicy(long nativePtr,int enumValue);
private native int getIncSubscribePolicy(long nativePtr);
private native void enableSubscribes(long nativePtr,boolean value);
private native boolean isSubscribesEnabled(long nativePtr);
private native int getStatus(long nativePtr);
private native Object getPresenceModel(long nativePtr);
private native void setPresenceModel(long nativePtr, long presencePtr);
private native void edit(long nativePtr);
private native void done(long nativePtr);
private native Object getCore(long ptr);
private native void setRefKey(long nativePtr, String key);
private native String getRefKey(long nativePtr);
private native void setName(long nativePtr, String name);
private native String getName(long nativePtr);
extern "C" void Java_org_linphone_core_LinphoneFriendImpl_finalize(JNIEnv* env
,jobject thiz
,jlong ptr) {
LinphoneFriend *lfriend=(LinphoneFriend*)ptr;
linphone_friend_set_user_data(lfriend,NULL);
linphone_friend_unref(lfriend);
}
submodules/linphone/coreapi/private.h:struct _LinphoneFriend{
struct _LinphoneFriend{
belle_sip_object_t base;
void *user_data;
LinphoneAddress *uri;
MSList *insubs; /*list of SalOp. There can be multiple instances of a same Friend that subscribe to our presence*/
SalOp *outsub;
LinphoneSubscribePolicy pol;
LinphonePresenceModel *presence;
struct _LinphoneCore *lc;
BuddyInfo *info;
char *refkey;
bool_t subscribe;
bool_t subscribe_active;
bool_t inc_subscribe_pending;
bool_t commit;
bool_t initial_subscribes_sent; /*used to know if initial subscribe message was sent or not*/
bool_t presence_received;
LinphoneVcard *vcard;
unsigned int storage_id;
LinphoneFriendList *friend_list;
};
我隐隐约约的明白了, 只要明白LinphoneFriend 就可以明白这个类型是干什么工作的了。
LinphoneSubscribePolicy
submodules/linphone/coreapi/linphonefriend.h:typedef enum _LinphoneSubscribePolicy {
/**
* @addtogroup buddy_list
* @{
*/
/**
* Enum controlling behavior for incoming subscription request.
* <br> Use by linphone_friend_set_inc_subscribe_policy()
*/
typedef enum _LinphoneSubscribePolicy {
/**
* Does not automatically accept an incoming subscription request.
* This policy implies that a decision has to be taken for each incoming subscription request notified by callback LinphoneCoreVTable.new_subscription_requested
*
*/
LinphoneSPWait,
/**
* Rejects incoming subscription request.
*/
LinphoneSPDeny,
/**
* Automatically accepts a subscription request.
*/
LinphoneSPAccept
} LinphoneSubscribePolicy;
LinphonePresenceModel
submodules/linphone/coreapi/presence.c:struct _LinphonePresenceModel {
/**
* Represents the presence model as defined in RFC 4479 and RFC 4480.
* This model is not complete. For example, it does not handle devices.
*/
struct _LinphonePresenceModel {
LinphoneAddress *presentity; /* "The model seeks to describe the presentity, identified by a presentity URI.*/
void *user_data;
int refcnt;
MSList *services; /**< A list of _LinphonePresenceService structures. Also named tuples in the RFC. */
MSList *persons; /**< A list of _LinphonePresencePerson structures. */
MSList *notes; /**< A list of _LinphonePresenceNote structures. */
};
LinphoneVcard
submodules/linphone/coreapi/vcard.cc:struct _LinphoneVcard {
submodules/linphone/coreapi/vcard_stubs.c:struct _LinphoneVcard {
submodules/linphone/coreapi/vcard.h:typedef struct _LinphoneVcard LinphoneVcard;
struct _LinphoneVcard {
shared_ptr<belcard::BelCard> belCard;
char *etag;
char *url;
unsigned char *md5;
};
LinphoneFriendList
submodules/linphone/coreapi/private.h:struct _LinphoneFriendList {
struct _LinphoneFriendList {
belle_sip_object_t base;
void *user_data;
LinphoneCore *lc;
LinphoneEvent *event;
char *display_name;
char *rls_uri;
MSList *friends;
unsigned char *content_digest;
int expected_notification_version;
unsigned int storage_id;
char *uri;
MSList *dirty_friends_to_update;
int revision;
LinphoneFriendListCbs *cbs;
};
submodules/linphone/coreapi/linphonefriend.h:LINPHONE_PUBLIC void linphone_friend_set_user_data(LinphoneFriend *lf, void *data);
submodules/linphone/coreapi/friend.c:void linphone_friend_set_user_data(LinphoneFriend *lf, void *data){
void linphone_friend_set_user_data(LinphoneFriend *lf, void *data){
lf->user_data=data;
}
void linphone_friend_unref(LinphoneFriend *lf) {
belle_sip_object_unref(lf);
}
//LinphoneFriend
extern "C" jlong Java_org_linphone_core_LinphoneFriendImpl_newLinphoneFriend(JNIEnv* env
,jobject thiz
,jstring jFriendUri) {
LinphoneFriend* lResult;
if (jFriendUri) {
const char* friendUri = env->GetStringUTFChars(jFriendUri, NULL);
lResult = linphone_friend_new_with_address(friendUri);
linphone_friend_set_user_data(lResult,env->NewWeakGlobalRef(thiz));
env->ReleaseStringUTFChars(jFriendUri, friendUri);
} else {
lResult = linphone_friend_new();
linphone_friend_set_user_data(lResult,env->NewWeakGlobalRef(thiz));
}
return (jlong)lResult;
}
submodules/linphone/coreapi/linphonefriend.h:LINPHONE_PUBLIC void linphone_friend_set_user_data(LinphoneFriend *lf, void *data);
submodules/linphone/coreapi/friend.c:void linphone_friend_set_user_data(LinphoneFriend *lf, void *data){
void linphone_friend_set_user_data(LinphoneFriend *lf, void *data){
lf->user_data=data;
}
extern "C" void Java_org_linphone_core_LinphoneFriendImpl_setAddress(JNIEnv* env
,jobject thiz
,jlong ptr
,jlong linphoneAddress) {
linphone_friend_set_address((LinphoneFriend*)ptr,(LinphoneAddress*)linphoneAddress);
}
int linphone_friend_set_address(LinphoneFriend *lf, const LinphoneAddress *addr){
LinphoneAddress *fr = linphone_address_clone(addr);
LinphoneVcard *vcard = NULL;
linphone_address_clean(fr);
if (lf->uri != NULL) linphone_address_unref(lf->uri);
lf->uri = fr;
vcard = linphone_friend_get_vcard(lf);
if (vcard) {
linphone_vcard_edit_main_sip_address(vcard, linphone_address_as_string_uri_only(fr));
}
return 0;
}
submodules/linphone/coreapi/address.c:LinphoneAddress * linphone_address_clone(const LinphoneAddress *addr){
/**
* Clones a LinphoneAddress object.
**/
LinphoneAddress * linphone_address_clone(const LinphoneAddress *addr){
return sal_address_clone(addr);
}
sal_address_clone
submodules/linphone/coreapi/bellesip_sal/sal_address_impl.c:SalAddress * sal_address_clone(const SalAddress *addr){
SalAddress * sal_address_clone(const SalAddress *addr){
return (SalAddress *) belle_sip_object_ref(belle_sip_object_clone(BELLE_SIP_OBJECT(addr)));
}
submodules/linphone/coreapi/address.c:void linphone_address_clean(LinphoneAddress *uri){
submodules/linphone/coreapi/linphonecore.h:LINPHONE_PUBLIC void linphone_address_clean(LinphoneAddress *uri);
/**
* Removes address's tags and uri headers so that it is displayable to the user.
**/
void linphone_address_clean(LinphoneAddress *uri){
sal_address_clean(uri);
}
LinphoneVcard* linphone_friend_get_vcard(LinphoneFriend *fr) {
if (fr) {
return fr->vcard;
}
return NULL;
}
submodules/linphone/coreapi/vcard.cc:void linphone_vcard_edit_main_sip_address(LinphoneVcard *vCard, const char *sip_address) {
submodules/linphone/coreapi/vcard_stubs.c:void linphone_vcard_edit_main_sip_address(LinphoneVcard *vCard, const char *sip_address) {
void linphone_vcard_edit_main_sip_address(LinphoneVcard *vCard, const char *sip_address) {
if (!vCard || !sip_address) return;
if (vCard->belCard->getImpp().size() > 0) {
const shared_ptr<belcard::BelCardImpp> impp = vCard->belCard->getImpp().front();
impp->setValue(sip_address);
} else {
shared_ptr<belcard::BelCardImpp> impp = belcard::BelCardGeneric::create<belcard::BelCardImpp>();
impp->setValue(sip_address);
vCard->belCard->addImpp(impp);
}
}
/**
* Returns the SIP uri only as a string, that is display name is removed.
* The returned char * must be freed by the application. Use ms_free().
**/
char *linphone_address_as_string_uri_only(const LinphoneAddress *u){
return sal_address_as_string_uri_only(u);
}
sal_address_as_string_uri_only
char *sal_address_as_string_uri_only(const SalAddress *addr){
belle_sip_header_address_t* header_addr = BELLE_SIP_HEADER_ADDRESS(addr);
belle_sip_uri_t* sip_uri = belle_sip_header_address_get_uri(header_addr);
belle_generic_uri_t* absolute_uri = belle_sip_header_address_get_absolute_uri(header_addr);
char tmp[1024]={
0};
size_t off=0;
belle_sip_object_t* uri;
if (sip_uri) {
uri=(belle_sip_object_t*)sip_uri;
} else if (absolute_uri) {
uri=(belle_sip_object_t*)absolute_uri;
} else {
ms_error("Cannot generate string for addr [%p] with null uri",addr);
return NULL;
}
belle_sip_object_marshal(uri,tmp,sizeof(tmp),&off);
return ms_strdup(tmp);
}
extern "C" jlong Java_org_linphone_core_LinphoneFriendImpl_getAddress(JNIEnv* env
,jobject thiz
,jlong ptr) {
return (jlong)linphone_friend_get_address((LinphoneFriend*)ptr);
}
const LinphoneAddress *linphone_friend_get_address(const LinphoneFriend *lf){
return lf->uri;
}
extern "C" void Java_org_linphone_core_LinphoneFriendImpl_setIncSubscribePolicy(JNIEnv* env
,jobject thiz
,jlong ptr
,jint policy) {
linphone_friend_set_inc_subscribe_policy((LinphoneFriend*)ptr,(LinphoneSubscribePolicy)policy);
}
int linphone_friend_set_inc_subscribe_policy(LinphoneFriend *fr, LinphoneSubscribePolicy pol) {
fr->pol=pol;
return 0;
}
extern "C" jint Java_org_linphone_core_LinphoneFriendImpl_getIncSubscribePolicy(JNIEnv* env
,jobject thiz
,jlong ptr) {
return (jint)linphone_friend_get_inc_subscribe_policy((LinphoneFriend*)ptr);
}
LinphoneSubscribePolicy linphone_friend_get_inc_subscribe_policy(const LinphoneFriend *lf){
return lf->pol;
}
extern "C" void Java_org_linphone_core_LinphoneFriendImpl_enableSubscribes(JNIEnv* env
,jobject thiz
,jlong ptr
,jboolean value) {
linphone_friend_enable_subscribes((LinphoneFriend*)ptr,value);
}
int linphone_friend_enable_subscribes(LinphoneFriend *fr, bool_t val){
fr->subscribe=val;
return 0;
}
extern "C" jboolean Java_org_linphone_core_LinphoneFriendImpl_isSubscribesEnabled(JNIEnv* env
,jobject thiz
,jlong ptr) {
return (jboolean)linphone_friend_subscribes_enabled((LinphoneFriend*)ptr);
}
submodules/linphone/coreapi/linphonefriend.h:LINPHONE_PUBLIC bool_t linphone_friend_subscribes_enabled(const LinphoneFriend *lf);
submodules/linphone/coreapi/linphonefriend.h:#define linphone_friend_get_send_subscribe linphone_friend_subscribes_enabled
submodules/linphone/coreapi/linphonecore_jni.cc: return (jboolean)linphone_friend_subscribes_enabled((LinphoneFriend*)ptr);
extern "C" jint Java_org_linphone_core_LinphoneFriendImpl_getStatus(JNIEnv* env
,jobject thiz
,jlong ptr) {
return (jint)linphone_friend_get_status((LinphoneFriend*)ptr);
}
LinphoneOnlineStatus linphone_friend_get_status(const LinphoneFriend *lf){
LinphoneOnlineStatus online_status = LinphoneStatusOffline;
LinphonePresenceBasicStatus basic_status = LinphonePresenceBasicStatusClosed;
LinphonePresenceActivity *activity = NULL;
unsigned int nb_activities = 0;
if (lf->presence != NULL) {
basic_status = linphone_presence_model_get_basic_status(lf->presence);
nb_activities = linphone_presence_model_get_nb_activities(lf->presence);
online_status = (basic_status == LinphonePresenceBasicStatusOpen) ? LinphoneStatusOnline : LinphoneStatusOffline;
if (nb_activities > 1) {
char *tmp = NULL;
const LinphoneAddress *addr = linphone_friend_get_address(lf);
if (addr) tmp = linphone_address_as_string(addr);
ms_warning("Friend %s has several activities, get status from the first one", tmp ? tmp : "unknown");
if (tmp) ms_free(tmp);
nb_activities = 1;
}
if (nb_activities == 1) {
activity = linphone_presence_model_get_activity(lf->presence);
switch (linphone_presence_activity_get_type(activity)) {
case LinphonePresenceActivityBreakfast:
case LinphonePresenceActivityDinner:
case LinphonePresenceActivityLunch:
case LinphonePresenceActivityMeal:
online_status = LinphoneStatusOutToLunch;
break;
case LinphonePresenceActivityAppointment:
case LinphonePresenceActivityMeeting:
case LinphonePresenceActivityPerformance:
case LinphonePresenceActivityPresentation:
case LinphonePresenceActivitySpectator:
case LinphonePresenceActivityWorking:
case LinphonePresenceActivityWorship:
online_status = LinphoneStatusDoNotDisturb;
break;
case LinphonePresenceActivityAway:
case LinphonePresenceActivitySleeping:
online_status = LinphoneStatusAway;
break;
case LinphonePresenceActivityHoliday:
case LinphonePresenceActivityTravel:
case LinphonePresenceActivityVacation:
online_status = LinphoneStatusVacation;
break;
case LinphonePresenceActivityBusy:
case LinphonePresenceActivityLookingForWork:
case LinphonePresenceActivityPlaying:
case LinphonePresenceActivityShopping:
case LinphonePresenceActivityTV:
online_status = LinphoneStatusBusy;
break;
case LinphonePresenceActivityInTransit:
case LinphonePresenceActivitySteering:
online_status = LinphoneStatusBeRightBack;
break;
case LinphonePresenceActivityOnThePhone:
online_status = LinphoneStatusOnThePhone;
break;
case LinphonePresenceActivityOther:
case LinphonePresenceActivityPermanentAbsence:
online_status = LinphoneStatusMoved;
break;
case LinphonePresenceActivityUnknown:
/* Rely on the basic status information. */
break;
case LinphonePresenceActivityOnline:
/* Should not happen! */
/*ms_warning("LinphonePresenceActivityOnline should not happen here!");*/
break;
case LinphonePresenceActivityOffline:
online_status = LinphoneStatusOffline;
break;
}
}
}
return online_status;
}
/*
* Class: org_linphone_core_LinphoneFriendImpl
* Method: getPresenceModel
* Signature: (J)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_linphone_core_LinphoneFriendImpl_getPresenceModel(JNIEnv *env, jobject jobj, jlong ptr) {
LinphoneFriend *lf = (LinphoneFriend *)ptr;
LinphonePresenceModel *model = (LinphonePresenceModel *)linphone_friend_get_presence_model(lf);
if (model == NULL) return NULL;
RETURN_USER_DATA_OBJECT("PresenceModelImpl", linphone_presence_model, model);
}
const LinphonePresenceModel * linphone_friend_get_presence_model(LinphoneFriend *lf) {
return lf->presence;
}
/*
* Class: org_linphone_core_LinphoneCoreImpl
* Method: setPresenceModel
* Signature: (JILjava/lang/String;J)V
*/
JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneCoreImpl_setPresenceModel(JNIEnv *env, jobject jobj, jlong ptr, jlong modelPtr) {
LinphoneCore *lc = (LinphoneCore *)ptr;
LinphonePresenceModel *model = (LinphonePresenceModel *)modelPtr;
linphone_core_set_presence_model(lc, model);
}
extern "C" void Java_org_linphone_core_LinphoneFriendImpl_edit(JNIEnv* env
,jobject thiz
,jlong ptr) {
return linphone_friend_edit((LinphoneFriend*)ptr);
}
void linphone_friend_edit(LinphoneFriend *fr) {
if (fr && fr->vcard) {
linphone_vcard_compute_md5_hash(fr->vcard);
}
}
extern "C" void Java_org_linphone_core_LinphoneFriendImpl_done(JNIEnv* env
,jobject thiz
,jlong ptr) {
linphone_friend_done((LinphoneFriend*)ptr);
}
void linphone_friend_done(LinphoneFriend *fr) {
ms_return_if_fail(fr);
if (!fr->lc || !fr->friend_list) return;
linphone_friend_apply(fr, fr->lc);
linphone_friend_save(fr, fr->lc);
if (fr && fr->vcard) {
if (linphone_vcard_compare_md5_hash(fr->vcard) != 0) {
ms_debug("vCard's md5 has changed, mark friend as dirty");
fr->friend_list->dirty_friends_to_update = ms_list_append(fr->friend_list->dirty_friends_to_update, linphone_friend_ref(fr));
}
}
}
extern "C" jobject Java_org_linphone_core_LinphoneChatRoomImpl_getCore(JNIEnv* env
,jobject thiz
,jlong chatroom_ptr){
LinphoneCore *lc=linphone_chat_room_get_core((LinphoneChatRoom*)chatroom_ptr);
LinphoneJavaBindings *ljb = (LinphoneJavaBindings *)linphone_core_get_user_data(lc);
jobject core = ljb->getCore();
return core;
}
extern "C" void Java_org_linphone_core_LinphoneFriendImpl_setRefKey(JNIEnv* env
,jobject thiz
,jlong ptr
,jstring jkey) {
const char* key = env->GetStringUTFChars(jkey, NULL);
linphone_friend_set_ref_key((LinphoneFriend*)ptr,key);
env->ReleaseStringUTFChars(jkey, key);
}
void linphone_friend_set_ref_key(LinphoneFriend *lf, const char *key){
if (lf->refkey != NULL) {
ms_free(lf->refkey);
lf->refkey = NULL;
}
if (key) {
lf->refkey = ms_strdup(key);
}
if (lf->lc) {
linphone_friend_save(lf, lf->lc);
}
}
extern "C" jstring Java_org_linphone_core_LinphoneFriendImpl_getRefKey(JNIEnv* env
,jobject thiz
,jlong ptr) {
const char * key = linphone_friend_get_ref_key((LinphoneFriend *)ptr);
return key ? env->NewStringUTF(key) : NULL;
}
extern "C" void Java_org_linphone_core_LinphoneFriendImpl_setName(JNIEnv* env
,jobject thiz
,jlong ptr
,jstring jname) {
const char* name = env->GetStringUTFChars(jname, NULL);
linphone_friend_set_name((LinphoneFriend*)ptr, name);
env->ReleaseStringUTFChars(jname, name);
}
extern "C" jstring Java_org_linphone_core_LinphoneFriendImpl_getName(JNIEnv* env
,jobject thiz
,jlong ptr) {
const char *name = linphone_friend_get_name((LinphoneFriend*)ptr);
return name ? env->NewStringUTF(name) : NULL;
}
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数