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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 打了孩子后悔了怎么办 12小孩脾气很犟怎么办 被学生气着了怎么办 1岁宝宝轻微咳嗽怎么办 4岁宝宝突然呕吐怎么办 4岁儿童突然呕吐怎么办 四岁儿童90身高怎么办 24个月宝宝缺钙怎么办 狗狗总是要人陪着玩怎么办 成年了还是很皮怎么办 三岁儿子太调皮怎么办 10个月宝宝粘人怎么办 6个月宝宝粘人怎么办 9个月宝宝偏矮怎么办 1岁宝宝粘人爱哭怎么办 宝宝2岁半胆小怎么办 5岁宝宝超级粘人怎么办 狗狗吃饭要人喂怎么办 十个月宝宝认人怎么办 一岁宝宝粘人怎么办 9个月宝宝粘妈妈怎么办 一岁的宝宝呕吐怎么办 宝宝一岁八个月太粘人了怎么办 六个月的宝宝好粘人怎么办 两岁半宝宝说话突然结巴了怎么办 1岁宝宝突然呕吐怎么办 宝宝吃坏了呕吐怎么办 1岁宝宝吃饭爱玩怎么办 7岁儿童半夜呕吐怎么办 一个月宝宝粘人怎么办 2岁宝宝太粘人了怎么办 8个月宝宝很粘人怎么办 7个月宝宝呕吐是怎么办 一个月婴儿粘人怎么办 八个月小孩粘人怎么办 一岁的宝宝粘人怎么办 六个月宝宝粘人爱哭怎么办 摔伤结巴里面灌脓了怎么办 两周半的宝宝说话结巴怎么办 孩子两周说话结巴怎么办 名字取了生僻字考大学怎么办