linphone-PresenceServiceImpl文件对应的JNI层文件分析
来源:互联网 发布:mac口红一盒 编辑:程序博客网 时间:2024/06/05 09:30
说明
今天是情人节,今天啥也不想说。
native函数
private native long newPresenceServiceImpl(String id, int status, String contact); private native void unref(long nativePtr); private native String getId(long nativePtr); private native int setId(long nativePtr, String id); private native int getBasicStatus(long nativePtr); private native int setBasicStatus(long nativePtr, int status); private native String getContact(long nativePtr); private native int setContact(long nativePtr, String contact); private native long getNbNotes(long nativePtr); private native Object getNthNote(long nativePtr, long idx); private native int addNote(long nativePtr, long notePtr); private native int clearNotes(long nativePtr);
具体的函数分析
native long newPresenceServiceImpl(String id, int status, String contact);
/* * Class: org_linphone_core_PresenceServiceImpl * Method: newPresenceServiceImpl * Signature: (Ljava/lang/String;ILjava/lang/String;)J */JNIEXPORT jlong JNICALL Java_org_linphone_core_PresenceServiceImpl_newPresenceServiceImpl(JNIEnv *env, jobject jobj, jstring id, jint basic_status, jstring contact) { LinphonePresenceService *service; const char *cid = id ? env->GetStringUTFChars(id, NULL) : NULL; const char *ccontact = contact ? env->GetStringUTFChars(contact, NULL) : NULL; service = linphone_presence_service_new(cid, (LinphonePresenceBasicStatus)basic_status, ccontact); service = linphone_presence_service_ref(service); if (cid) env->ReleaseStringUTFChars(id, cid); if (ccontact) env->ReleaseStringUTFChars(contact, ccontact); return (jlong)service;}
LinphonePresenceService
linphone/coreapi/presence.c:struct _LinphonePresenceService {linphone/coreapi/linphonepresence.h:struct _LinphonePresenceService;linphone/coreapi/linphonepresence.h:typedef struct _LinphonePresenceService LinphonePresenceService;
struct _LinphonePresenceService { void *user_data; int refcnt; char *id; LinphonePresenceBasicStatus status; char *contact; MSList *notes; /**< A list of _LinphonePresenceNote structures. */ time_t timestamp;};
这个是第一个, 我觉得不是很像。
/** * Structure holding the information about a presence service. */struct _LinphonePresenceService;
这个才是真的。
/** * Presence service type holding information about a presence service. */typedef struct _LinphonePresenceService LinphonePresenceService;
原来LinphonePresenceService是这个的定义。
找来找去, 才会返现, presence.c还真是最后的实现呢。
linphone_presence_service_new
linphone/coreapi/presence.c:LinphonePresenceService * linphone_presence_service_new(const char *id, LinphonePresenceBasicStatus basic_status, const char *contact) {linphone/coreapi/linphonepresence.h:LINPHONE_PUBLIC LinphonePresenceService * linphone_presence_service_new(const char *id, LinphonePresenceBasicStatus basic_status, const char *contact);
/***************************************************************************** * PRESENCE SERVICE FUNCTIONS TO GET ACCESS TO ALL FUNCTIONALITIES * ****************************************************************************/LinphonePresenceService * linphone_presence_service_new(const char *id, LinphonePresenceBasicStatus basic_status, const char *contact) { LinphonePresenceService *service; char *service_id; if (id == NULL) service_id = generate_presence_id(); else service_id = ms_strdup(id); service = presence_service_new(service_id, basic_status); linphone_presence_service_set_contact(service, contact); if (service_id != NULL) ms_free(service_id); return service;}
generate_presence_id
linphone/coreapi/presence.c:static char * generate_presence_id(void) {
static char * generate_presence_id(void) { char id[7]; int i; id[0] = presence_id_valid_start_characters[ortp_random() % (sizeof(presence_id_valid_start_characters)-1)]; for (i = 1; i < 6; i++) { id[i] = presence_id_valid_characters[ortp_random() % (sizeof(presence_id_valid_characters)-1)]; } id[6] = '\0'; return ms_strdup(id);}
presence_id_valid_start_characters
static char presence_id_valid_start_characters[] = ":_abcdefghijklmnopqrstuvwxyz";
presence_service_new
static LinphonePresenceService * presence_service_new(const char *id, LinphonePresenceBasicStatus status) { LinphonePresenceService *service = ms_new0(LinphonePresenceService, 1); service->refcnt = 1; if (id != NULL) { service->id = ms_strdup(id); } service->status = status; service->timestamp = time(NULL); return service;}
linphone_presence_service_set_contact
int linphone_presence_service_set_contact(LinphonePresenceService *service, const char *contact) { if (service == NULL) return -1; if (service->contact != NULL) ms_free(service->contact); if (contact != NULL) service->contact = ms_strdup(contact); else service->contact = NULL; return 0;}
linphone_presence_service_ref
LinphonePresenceService * linphone_presence_service_ref(LinphonePresenceService *service) { service->refcnt++; return service;}
LinphonePresenceBasicStatus
linphone/coreapi/linphonepresence.h:typedef enum LinphonePresenceBasicStatus {
/** Basic status as defined in section 4.1.4 of RFC 3863 */typedef enum LinphonePresenceBasicStatus { /** This value means that the associated contact element, if any, is ready to accept communication. */ LinphonePresenceBasicStatusOpen, /** This value means that the associated contact element, if any, is unable to accept communication. */ LinphonePresenceBasicStatusClosed} LinphonePresenceBasicStatus;
这个状态其实就是一个枚举。
native void unref(long nativePtr);
JNIEXPORT void JNICALL Java_org_linphone_core_PresenceServiceImpl_unref(JNIEnv *env, jobject jobj, jlong ptr) { LinphonePresenceService *service = (LinphonePresenceService *)ptr; linphone_presence_service_unref(service);}
linphone_presence_service_unref
linphone/coreapi/linphonepresence.h:LINPHONE_PUBLIC LinphonePresenceService * linphone_presence_service_unref(LinphonePresenceService *service);linphone/coreapi/presence.c:LinphonePresenceService * linphone_presence_service_unref(LinphonePresenceService *service) {
LinphonePresenceService * linphone_presence_service_unref(LinphonePresenceService *service) { service->refcnt--; if (service->refcnt == 0) { presence_service_delete(service); return NULL; } return service;}
presence_service_delete
static void presence_service_delete(LinphonePresenceService *service) { if (service->id != NULL) { ms_free(service->id); } if (service->contact != NULL) { ms_free(service->contact); } ms_list_for_each(service->notes, (MSIterateFunc)linphone_presence_note_unref); ms_list_free(service->notes); ms_free(service);};
native String getId(long nativePtr);
/* * Class: org_linphone_core_PresenceServiceImpl * Method: getId * Signature: (J)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_org_linphone_core_PresenceServiceImpl_getId(JNIEnv *env, jobject jobj, jlong ptr) { LinphonePresenceService *service = (LinphonePresenceService *)ptr; char *cid = linphone_presence_service_get_id(service); jstring jid = cid ? env->NewStringUTF(cid) : NULL; if (cid) ms_free(cid); return jid;}
linphone_presence_service_get_id
char * linphone_presence_service_get_id(const LinphonePresenceService *service) { if (service == NULL) return NULL; return ms_strdup(service->id);}
native int setId(long nativePtr, String id);
/* * Class: org_linphone_core_PresenceServiceImpl * Method: setId * Signature: (JLjava/lang/String;)I */JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceServiceImpl_setId(JNIEnv *env, jobject jobj, jlong ptr, jstring id) { LinphonePresenceService *service = (LinphonePresenceService *)ptr; const char *cid = id ? env->GetStringUTFChars(id, NULL) : NULL; linphone_presence_service_set_id(service, cid); if (cid) env->ReleaseStringUTFChars(id, cid); return (jint)0;}
linphone_presence_service_set_id
int linphone_presence_service_set_id(LinphonePresenceService *service, const char *id) { if (service == NULL) return -1; if (service->id != NULL) ms_free(service->id); if (id == NULL) service->id = generate_presence_id(); else service->id = ms_strdup(id); return 0;}
native int getBasicStatus(long nativePtr);
/* * Class: org_linphone_core_PresenceServiceImpl * Method: getBasicStatus * Signature: (J)I */JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceServiceImpl_getBasicStatus(JNIEnv *env, jobject jobj, jlong ptr) { LinphonePresenceService *service = (LinphonePresenceService *)ptr; return (jint)linphone_presence_service_get_basic_status(service);}
linphone_presence_service_get_basic_status
LinphonePresenceBasicStatus linphone_presence_service_get_basic_status(const LinphonePresenceService *service) { if (service == NULL) return LinphonePresenceBasicStatusClosed; return service->status;}
native int setBasicStatus(long nativePtr, int status);
/* * Class: org_linphone_core_PresenceServiceImpl * Method: setBasicStatus * Signature: (JI)I */JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceServiceImpl_setBasicStatus(JNIEnv *env, jobject jobj, jlong ptr, jint basic_status) { LinphonePresenceService *service = (LinphonePresenceService *)ptr; return (jint)linphone_presence_service_set_basic_status(service, (LinphonePresenceBasicStatus)basic_status);}
linphone_presence_service_set_basic_status
int linphone_presence_service_set_basic_status(LinphonePresenceService *service, LinphonePresenceBasicStatus basic_status) { if (service == NULL) return -1; service->status = basic_status; return 0;}
native String getContact(long nativePtr);
/* * Class: org_linphone_core_PresenceServiceImpl * Method: getContact * Signature: (J)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_org_linphone_core_PresenceServiceImpl_getContact(JNIEnv *env, jobject jobj, jlong ptr) { LinphonePresenceService *service = (LinphonePresenceService *)ptr; char *ccontact = linphone_presence_service_get_contact(service); jstring jcontact = ccontact ? env->NewStringUTF(ccontact) : NULL; if (ccontact) ms_free(ccontact); return jcontact;}
linphone_presence_service_get_contact
char * linphone_presence_service_get_contact(const LinphonePresenceService *service) { if (service->contact == NULL) return NULL; return ms_strdup(service->contact);}
native int setContact(long nativePtr, String contact);
/* * Class: org_linphone_core_PresenceServiceImpl * Method: setContact * Signature: (JLjava/lang/String;)I */JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceServiceImpl_setContact(JNIEnv *env, jobject jobj, jlong ptr, jstring contact) { LinphonePresenceService *service = (LinphonePresenceService *)ptr; const char *ccontact = contact ? env->GetStringUTFChars(contact, NULL) : NULL; linphone_presence_service_set_contact(service, ccontact); if (ccontact) env->ReleaseStringUTFChars(contact, ccontact); return (jint)0;}
linphone_presence_service_set_contact
int linphone_presence_service_set_contact(LinphonePresenceService *service, const char *contact) { if (service == NULL) return -1; if (service->contact != NULL) ms_free(service->contact); if (contact != NULL) service->contact = ms_strdup(contact); else service->contact = NULL; return 0;}
native long getNbNotes(long nativePtr);
/* * Class: org_linphone_core_PresenceServiceImpl * Method: getNbNotes * Signature: (J)J */JNIEXPORT jlong JNICALL Java_org_linphone_core_PresenceServiceImpl_getNbNotes(JNIEnv *env, jobject jobj, jlong ptr) { LinphonePresenceService *service = (LinphonePresenceService *)ptr; return (jlong)linphone_presence_service_get_nb_notes(service);}
linphone_presence_service_get_nb_notes
unsigned int linphone_presence_service_get_nb_notes(const LinphonePresenceService *service) { return ms_list_size(service->notes);}
native Object getNthNote(long nativePtr, long idx);
/* * Class: org_linphone_core_PresenceServiceImpl * Method: getNthNote * Signature: (JJ)Ljava/lang/Object; */JNIEXPORT jobject JNICALL Java_org_linphone_core_PresenceServiceImpl_getNthNote(JNIEnv *env, jobject jobj, jlong ptr, jlong idx) { LinphonePresenceService *service = (LinphonePresenceService *)ptr; LinphonePresenceNote *note = linphone_presence_service_get_nth_note(service, (unsigned int)idx); if (note == NULL) return NULL; RETURN_USER_DATA_OBJECT("PresenceNoteImpl", linphone_presence_note, note)}
linphone_presence_service_get_nth_note
LinphonePresenceNote * linphone_presence_service_get_nth_note(const LinphonePresenceService *service, unsigned int idx) { if ((service == NULL) || (idx >= linphone_presence_service_get_nb_notes(service))) return NULL; return (LinphonePresenceNote *)ms_list_nth_data(service->notes, idx);}
ms_list_nth_data
linphone/mediastreamer2/include/mediastreamer2/mscommon.h:MS2_PUBLIC void * ms_list_nth_data(const MSList *list, int index);linphone/mediastreamer2/src/base/mscommon.c:void * ms_list_nth_data(const MSList *list, int index){
RETURN_USER_DATA_OBJECT
linphone/coreapi/linphonecore_jni.cc:#define RETURN_USER_DATA_OBJECT(javaclass, funcprefix, cobj) \
#define RETURN_USER_DATA_OBJECT(javaclass, funcprefix, cobj) \ { \ jclass jUserDataObjectClass; \ jmethodID jUserDataObjectCtor; \ jobject jUserDataObj; \ jUserDataObj = (jobject)funcprefix ## _get_user_data(cobj); \ if (jUserDataObj == NULL) { \ jUserDataObjectClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/" javaclass)); \ jUserDataObjectCtor = env->GetMethodID(jUserDataObjectClass,"<init>", "(J)V"); \ jUserDataObj = env->NewObject(jUserDataObjectClass, jUserDataObjectCtor, (jlong)funcprefix ## _ref(cobj)); \ jUserDataObj = env->NewGlobalRef(jUserDataObj); \ funcprefix ## _set_user_data(cobj, jUserDataObj); \ env->DeleteGlobalRef(jUserDataObjectClass); \ } \ return jUserDataObj; \ }
native int addNote(long nativePtr, long notePtr);
/* * Class: org_linphone_core_PresenceModelImpl * Method: addNote * Signature: (JLjava/lang/String;Ljava/lang/String;)I */JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_addNote(JNIEnv *env, jobject jobj, jlong ptr, jstring description, jstring lang) { LinphonePresenceModel *model = (LinphonePresenceModel *)ptr; const char *cdescription = description ? env->GetStringUTFChars(description, NULL) : NULL; const char *clang = lang ? env->GetStringUTFChars(lang, NULL) : NULL; jint res = (jint)linphone_presence_model_add_note(model, cdescription, clang); if (cdescription) env->ReleaseStringUTFChars(description, cdescription); if (clang) env->ReleaseStringUTFChars(lang, clang); return res;}
linphone_presence_model_add_note
int linphone_presence_model_add_note(LinphonePresenceModel *model, const char *note_content, const char *lang) { LinphonePresenceService *service; LinphonePresenceNote *note; if ((model == NULL) || (note_content == NULL)) return -1; /* Will put the note in the first service. */ service = ms_list_nth_data(model->services, 0); if (service == NULL) { /* If no service exists, create one. */ service = presence_service_new(generate_presence_id(), LinphonePresenceBasicStatusClosed); } if (service == NULL) return -1; /* Search for an existing note in the specified language. */ note = find_presence_note_in_list(service->notes, lang); if (note == NULL) { note = linphone_presence_note_new(note_content, lang); } else { linphone_presence_note_set_content(note, note_content); } if (note == NULL) return -1; presence_service_add_note(service, note); return 0;}
LinphonePresenceModel
linphone/coreapi/presence.c:struct _LinphonePresenceModel {linphone/coreapi/linphonepresence.h:struct _LinphonePresenceModel;linphone/coreapi/linphonepresence.h:typedef struct _LinphonePresenceModel 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. */};
LinphonePresenceNote
linphone/coreapi/presence.c:struct _LinphonePresenceNote {
struct _LinphonePresenceNote { void *user_data; int refcnt; char *lang; char *content;};
presence_service_new
static LinphonePresenceService * presence_service_new(const char *id, LinphonePresenceBasicStatus status) { LinphonePresenceService *service = ms_new0(LinphonePresenceService, 1); service->refcnt = 1; if (id != NULL) { service->id = ms_strdup(id); } service->status = status; service->timestamp = time(NULL); return service;}
find_presence_note_in_list
linphone/coreapi/presence.c:static LinphonePresenceNote * find_presence_note_in_list(MSList *list, const char *lang) {
static LinphonePresenceNote * find_presence_note_in_list(MSList *list, const char *lang) { int nb; int i; nb = ms_list_size(list); for (i = 0; i < nb; i++) { LinphonePresenceNote *note = (LinphonePresenceNote *)ms_list_nth_data(list, i); if (lang == NULL) { if (note->lang == NULL) { return note; } } else { if ((note->lang != NULL) && (strcmp(lang, note->lang) == 0)) { return note; } } } return NULL;}
linphone_presence_note_new
/***************************************************************************** * PRESENCE NOTE FUNCTIONS TO GET ACCESS TO ALL FUNCTIONALITIES * ****************************************************************************/LinphonePresenceNote * linphone_presence_note_new(const char *content, const char *lang) { LinphonePresenceNote *note; if (content == NULL) return NULL; note = ms_new0(LinphonePresenceNote, 1); note->refcnt = 1; note->content = ms_strdup(content); if (lang != NULL) { note->lang = ms_strdup(lang); } return note;}
linphone_presence_note_set_content
int linphone_presence_note_set_content(LinphonePresenceNote *note, const char *content) { if (content == NULL) return -1; if (note->content != NULL) { ms_free(note->content); } note->content = ms_strdup(content); return 0;}
native int clearNotes(long nativePtr);
/* * Class: org_linphone_core_PresenceModelImpl * Method: clearNotes * Signature: (J)I */JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_clearNotes(JNIEnv *env, jobject jobj, jlong ptr) { LinphonePresenceModel *model = (LinphonePresenceModel *)ptr; return (jint)linphone_presence_model_clear_notes(model);}
linphone_presence_model_clear_notes
linphone/coreapi/presence.c:int linphone_presence_model_clear_notes(LinphonePresenceModel *model) {linphone/coreapi/linphonepresence.h:LINPHONE_PUBLIC int linphone_presence_model_clear_notes(LinphonePresenceModel *model);
int linphone_presence_model_clear_notes(LinphonePresenceModel *model) { if (model == NULL) return -1; ms_list_for_each(model->persons, (MSIterateFunc)clear_presence_person_notes); ms_list_for_each(model->services, (MSIterateFunc)clear_presence_service_notes); ms_list_for_each(model->notes, (MSIterateFunc)linphone_presence_note_unref); ms_list_free(model->notes); model->notes = NULL; return 0;}
ms_list_for_each
linphone/mediastreamer2/src/base/mscommon.c:void ms_list_for_each(const MSList *list, void (*func)(void *)){linphone/mediastreamer2/include/mediastreamer2/mscommon.h:MS2_PUBLIC void ms_list_for_each(const MSList *list, MSIterateFunc iterate_func);linphone/mediastreamer2/include/mediastreamer2/mscommon.h:MS2_PUBLIC void ms_list_for_each2(const MSList *list, MSIterate2Func iterate_func, void *user_data);linphone/mediastreamer2/include/mediastreamer2/mscommon.h:MS2_PUBLIC void ms_list_for_each3(const MSList *list, MSIterate3Func iterate_func, void *user_data, void *factory);
void ms_list_for_each(const MSList *list, void (*func)(void *)){ for(;list!=NULL;list=list->next){ func(list->data); }}void ms_list_for_each2(const MSList *list, void (*func)(void *, void *y), void *user_data){ for(;list!=NULL;list=list->next){ func(list->data,user_data); }}void ms_list_for_each3(const MSList *list, void (*func)(void *, void *, void*), void *user_data, void* factory){ for(;list!=NULL;list=list->next){ func(list->data,user_data, factory); }}
1 0
- linphone-PresenceServiceImpl文件对应的JNI层文件分析
- linphone-LinphoneAddressImpl文件对应的JNI层文件分析
- linphone-LinphoneProxyConfigImpl文件对应的JNI层文件分析
- linphone-LinphoneCallLogImpl文件对应的JNI层文件分析
- linphone-LinphoneCallParamsImpl文件对应的JNI层文件分析
- linphone-LinphoneChatMessageImpl文件对应的JNI层文件分析
- linphone-LinphoneChatRoomImpl文件对应的JNI层文件分析
- linphone-LinphoneCoreFactoryImpl文件对应的JNI层文件分析
- linphone-LinphoneFriendImpl文件对应的JNI层文件分析
- linphone-PayloadTypeImpl文件对应的JNI层文件分析
- linphone-LpConfigImpl文件对应的JNI层文件分析
- linphone-LinphoneInfoMessageImpl文件对应的JNI层文件分析
- linphone-LinphoneEventImpl文件对应的JNI层文件分析
- linphone-PresenceActivityImpl文件对应的JNI层文件分析
- linphone-PresenceModelImpl文件对应的JNI层文件分析
- linphone-PresenceNoteImpl文件对应的JNI层文件分析
- linphone-PresencePersonImpl文件对应的JNI层文件分析
- linphone-ErrorInfoImpl文件对应的JNI层文件分析
- 爬某个音乐网站上的音乐程序
- JS代码优化一:谷歌浏览器的timeline工具的使用
- jQuery对象和DOM对象相互装换
- 09.Apache 2.4 基于端口配置多个Diango项目
- hdu5783(2016多校第五场,dp)
- linphone-PresenceServiceImpl文件对应的JNI层文件分析
- POJ 2585Window Pains
- 【笔试面试】第三波
- Memcached
- Java基础之-IO中的字节流
- 随机数
- 关于 tomcat 与X-Frame-Options
- linphone-ErrorInfoImpl文件对应的JNI层文件分析
- shell编程入门开始: