说明
第一阶段:java核心代码。
第二阶段:native核心代码。 <======
第三阶段:java界面及逻辑部分。
第四阶段:java及c部分的逻辑。
第五阶段:具体的编码解码。
native函数
private native long newPresenceModelImpl();
private native long newPresenceModelImpl(int type, String description);
private native long newPresenceModelImpl(int type, String description, String note, String lang);
private native void unref(long nativePtr);
private native int getBasicStatus(long nativePtr);
private native int setBasicStatus(long nativePtr, int basic_status);
private native long getTimestamp(long nativePtr);
private native String getContact(long nativePtr);
private native void setContact(long nativePtr, String contact);
private native Object getActivity(long nativePtr);
private native int setActivity(long nativePtr, int activity, String description);
private native long getNbActivities(long nativePtr);
private native Object getNthActivity(long nativePtr, long idx
private native int addActivity(long nativePtr, long activityPtr);
private native int clearActivities(long nativePtr);
private native Object getNote(long nativePtr, String lang);
private native int addNote(long nativePtr, String note_content, String lang);
private native int clearNotes(long nativePtr);
private native long getNbServices(long nativePtr);
private native Object getNthService(long nativePtr, long idx);
private native int addService(long nativePtr, long servicePtr);
private native int clearServices(long nativePtr);
private native long getNbPersons(long nativePtr);
private native Object getNthPerson(long nativePtr, long idx);
private native int addPerson(long nativePtr, long personPtr);
private native int clearPersons(long nativePtr);
具体的函数分析
newPresenceModelImpl
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: newPresenceModelImpl
* Signature: ()J
*/
JNIEXPORT jlong JNICALL Java_org_linphone_core_PresenceModelImpl_newPresenceModelImpl__(JNIEnv *env, jobject jobj) {
LinphonePresenceModel *model = linphone_presence_model_new();
model = linphone_presence_model_ref(model);
return (jlong)model;
}
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: newPresenceModelImpl
* Signature: (ILjava/lang/String;)J
*/
JNIEXPORT jlong JNICALL Java_org_linphone_core_PresenceModelImpl_newPresenceModelImpl__ILjava_lang_String_2(JNIEnv *env, jobject jobj, jint type, jstring description) {
LinphonePresenceModel *model;
const char *cdescription = description ? env->GetStringUTFChars(description, NULL) : NULL;
model = linphone_presence_model_new_with_activity((LinphonePresenceActivityType)type, cdescription);
model = linphone_presence_model_ref(model);
if (cdescription) env->ReleaseStringUTFChars(description, cdescription);
return (jlong)model;
}
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: newPresenceModelImpl
* Signature: (ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)J
*/
JNIEXPORT jlong JNICALL Java_org_linphone_core_PresenceModelImpl_newPresenceModelImpl__ILjava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2(
JNIEnv *env, jobject jobj, jint type, jstring description, jstring note, jstring lang) {
LinphonePresenceModel *model;
const char *cdescription = description ? env->GetStringUTFChars(description, NULL) : NULL;
const char *cnote = note ? env->GetStringUTFChars(note, NULL) : NULL;
const char *clang = lang ? env->GetStringUTFChars(lang, NULL) : NULL;
model = linphone_presence_model_new_with_activity_and_note((LinphonePresenceActivityType)type, cdescription, cnote, clang);
model = linphone_presence_model_ref(model);
if (cdescription) env->ReleaseStringUTFChars(description, cdescription);
if (cnote) env->ReleaseStringUTFChars(note, cnote);
if (clang) env->ReleaseStringUTFChars(lang, clang);
return (jlong)model;
}
这里有三个函数, 这里显示了在jni层java中的重构, 看一下。这里主要看的还是函数名, 因为其它的跟普通函数都差不多。
Java_org_linphone_core_PresenceModelImpl_newPresenceModelImpl__
Java_org_linphone_core_PresenceModelImpl_newPresenceModelImpl__ILjava_lang_String_2
Java_org_linphone_core_PresenceModelImpl_newPresenceModelImpl__ILjava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2
linphone_presence_model_new
LinphonePresenceModel * linphone_presence_model_new(void) {
LinphonePresenceModel *model = ms_new0(LinphonePresenceModel, 1);
model->refcnt = 1;
return model;
}
这个应该是已经找过了,
ms_new0
这个函数没有找过, 但是找过那个没有0后缀的函数。现在找一下吧。
哭泣, 没找到。
linphone_presence_model_ref
LinphonePresenceModel * linphone_presence_model_ref(LinphonePresenceModel *model) {
model->refcnt++;
return model;
}
/**
* 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. */
};
这个是LinphonePresenceModel定义的结构体类型, 这里呢是在linphonecorepreference中定义的, presence.c中实现的。
MSList
struct _MSList {
struct _MSList *next;
struct _MSList *prev;
void *data;
};
typedef struct _MSList MSList;
我竟然找到MSList结构体类型了, 那天说什么也没有找到。 怎么找到的呢。 “grep -r “MSList” | more”, 然后按空格键一行一行找到的。
linphone_presence_model_new_with_activity
LinphonePresenceModel * linphone_presence_model_new_with_activity(LinphonePresenceActivityType acttype, const char *description) {
LinphonePresenceModel *model = linphone_presence_model_new();
if (model != NULL) {
linphone_presence_model_set_activity(model, acttype, description);
}
return model;
}
linphone_presence_model_set_activity
int linphone_presence_model_set_activity(LinphonePresenceModel *model, LinphonePresenceActivityType acttype, const char *description) {
LinphonePresenceBasicStatus basic_status = LinphonePresenceBasicStatusOpen;
LinphonePresenceActivity *activity;
int err = 0;
if (model == NULL) return -1;
switch (acttype) {
case LinphonePresenceActivityAppointment:
case LinphonePresenceActivityBusy:
case LinphonePresenceActivityMeeting:
case LinphonePresenceActivityPermanentAbsence:
case LinphonePresenceActivityOffline:
case LinphonePresenceActivityWorship:
basic_status = LinphonePresenceBasicStatusClosed;
break;
default:
basic_status = LinphonePresenceBasicStatusOpen;
break;
}
if (linphone_presence_model_set_basic_status(model, basic_status) < 0) return -1;
linphone_presence_model_clear_activities(model);
activity = linphone_presence_activity_new(acttype, description);
if (activity == NULL) return -1;
err = linphone_presence_model_add_activity(model, activity);
----------
linphone_presence_activity_unref(activity);
return err;
}
linphone_presence_model_set_basic_status
int linphone_presence_model_set_basic_status(LinphonePresenceModel *model, LinphonePresenceBasicStatus basic_status) {
LinphonePresenceService *service;
int err = 0;
if (model == NULL) return -1;
linphone_presence_model_clear_services(model);
service = linphone_presence_service_new(NULL, basic_status, NULL);
if (service == NULL) return -1;
err = linphone_presence_model_add_service(model, service);
linphone_presence_service_unref(service);
return err;
}
linphone_presence_model_clear_services
int linphone_presence_model_clear_services(LinphonePresenceModel *model) {
if (model == NULL) return -1;
ms_list_for_each(model->services, (MSIterateFunc)linphone_presence_service_unref);
ms_list_free(model->services);
model->services = NULL;
return 0;
}
linphone_presence_service_new
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;
}
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_model_add_service
int linphone_presence_model_add_service(LinphonePresenceModel *model, LinphonePresenceService *service) {
if ((model == NULL) || (service == NULL)) return -1;
model->services = ms_list_append(model->services, linphone_presence_service_ref(service));
return 0;
}
linphone_presence_service_unref
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);
};
linphone_presence_model_clear_activities
int linphone_presence_model_clear_activities(LinphonePresenceModel *model) {
if (model == NULL) return -1;
ms_list_for_each(model->persons, (MSIterateFunc)linphone_presence_person_clear_activities);
return 0;
}
linphone_presence_activity_new
LinphonePresenceActivity * linphone_presence_activity_new(LinphonePresenceActivityType acttype, const char *description) {
LinphonePresenceActivity *act = ms_new0(LinphonePresenceActivity, 1);
act->refcnt = 1;
act->type = acttype;
if (description != NULL) {
act->description = ms_strdup(description);
}
return act;
}
linphone_presence_model_add_activity
int linphone_presence_model_add_activity(LinphonePresenceModel *model, LinphonePresenceActivity *activity) {
char *id = NULL;
LinphonePresencePerson *person = NULL;
if ((model == NULL) || (activity == NULL)) return -1;
if (ms_list_size(model->persons) == 0) {
/* There is no person in the presence model, add one. */
id = generate_presence_id();
person = presence_person_new(id, time(NULL));
if (id != NULL) ms_free(id);
if (person == NULL)
return -1;
presence_model_add_person(model, person);
} else {
/* Add the activity to the first person in the model. */
person = (LinphonePresencePerson *)ms_list_nth_data(model->persons, 0);
}
linphone_presence_person_add_activity(person, activity);
return 0;
}
presence_model_add_person
int linphone_presence_model_add_person(LinphonePresenceModel *model, LinphonePresencePerson *person) {
if ((model == NULL) || (person == NULL)) return -1;
model->persons = ms_list_append(model->persons, linphone_presence_person_ref(person));
return 0;
}
linphone_presence_person_add_activity
int linphone_presence_person_add_activity(LinphonePresencePerson *person, LinphonePresenceActivity *activity) {
if ((person == NULL) || (activity == NULL)) return -1;
person->activities = ms_list_append(person->activities, linphone_presence_activity_ref(activity));
return 0;
}
linphone_presence_model_new_with_activity_and_note
LinphonePresenceModel * linphone_presence_model_new_with_activity_and_note(LinphonePresenceActivityType acttype, const char *description, const char *note, const char *lang) {
LinphonePresenceModel *model = linphone_presence_model_new();
if (model != NULL) {
linphone_presence_model_set_activity(model, acttype, description);
linphone_presence_model_add_note(model, note, lang);
}
return model;
}
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;
}
presence_service_add_note
static void presence_service_add_note(LinphonePresenceService *service, LinphonePresenceNote *note) {
service->notes = ms_list_append(service->notes, note);
}
unref
JNIEXPORT void JNICALL Java_org_linphone_core_PresenceModelImpl_unref(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
linphone_presence_model_unref(model);
}
linphone_presence_model_unref
LinphonePresenceModel * linphone_presence_model_unref(LinphonePresenceModel *model) {
model->refcnt--;
if (model->refcnt == 0) {
presence_model_delete(model);
return NULL;
}
return model;
}
presence_model_delete
static void presence_model_delete(LinphonePresenceModel *model) {
if (model == NULL) return;
if (model->presentity)
linphone_address_unref(model->presentity);
ms_list_for_each(model->services, (MSIterateFunc)linphone_presence_service_unref);
ms_list_free(model->services);
ms_list_for_each(model->persons, (MSIterateFunc)linphone_presence_person_unref);
ms_list_free(model->persons);
ms_list_for_each(model->notes, (MSIterateFunc)linphone_presence_note_unref);
ms_list_free(model->notes);
ms_free(model);
}
getBasicStatus
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getBasicStatus
* Signature: (J)I
*/
JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_getBasicStatus(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
return (jint)linphone_presence_model_get_basic_status(model);
}
linphone_presence_model_get_basic_status
/* Suppose that if at least one service is open, then the model is open. */
LinphonePresenceBasicStatus linphone_presence_model_get_basic_status(const LinphonePresenceModel *model) {
LinphonePresenceBasicStatus status = LinphonePresenceBasicStatusClosed;
if (model != NULL) {
ms_list_for_each2(model->services, (MSIterate2Func)presence_model_find_open_basic_status, &status);
}
return status;
}
setBasicStatus
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: setBasicStatus
* Signature: (JI)I
*/
JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_setBasicStatus(JNIEnv *env, jobject jobj, jlong ptr, jint basic_status) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
return (jint)linphone_presence_model_set_basic_status(model, (LinphonePresenceBasicStatus)basic_status);
}
linphone_presence_model_set_basic_status
int linphone_presence_model_set_basic_status(LinphonePresenceModel *model, LinphonePresenceBasicStatus basic_status) {
LinphonePresenceService *service;
int err = 0;
if (model == NULL) return -1;
linphone_presence_model_clear_services(model);
service = linphone_presence_service_new(NULL, basic_status, NULL);
if (service == NULL) return -1;
err = linphone_presence_model_add_service(model, service);
linphone_presence_service_unref(service);
return err;
}
getTimestamp
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getTimestamp
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL Java_org_linphone_core_PresenceModelImpl_getTimestamp(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
return (jlong)linphone_presence_model_get_timestamp(model);
}
linphone_presence_model_get_timestamp
time_t linphone_presence_model_get_timestamp(const LinphonePresenceModel *model) {
time_t timestamp = (time_t)-1;
if (model == NULL)
return timestamp;
ms_list_for_each2(model->services, (MSIterate2Func)presence_service_find_newer_timestamp, ×tamp);
ms_list_for_each2(model->persons, (MSIterate2Func)presence_person_find_newer_timestamp, ×tamp);
return timestamp;
}
getContact
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getContact
* Signature: (J)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_org_linphone_core_PresenceModelImpl_getContact(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
char *ccontact = linphone_presence_model_get_contact(model);
jstring jcontact = ccontact ? env->NewStringUTF(ccontact) : NULL;
if (ccontact) ms_free(ccontact);
return jcontact;
}
linphone_presence_model_get_contact
char * linphone_presence_model_get_contact(const LinphonePresenceModel *model) {
char *contact = NULL;
ms_list_for_each2(model->services, (MSIterate2Func)presence_model_find_contact, &contact);
if (contact == NULL) return NULL;
return ms_strdup(contact);
}
setContact
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: setContact
* Signature: (JLjava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_org_linphone_core_PresenceModelImpl_setContact(JNIEnv *env, jobject jobj, jlong ptr, jstring contact) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
const char *ccontact = contact ? env->GetStringUTFChars(contact, NULL) : NULL;
linphone_presence_model_set_contact(model, ccontact);
if (ccontact) env->ReleaseStringUTFChars(contact, ccontact);
}
linphone_presence_model_set_contact
int linphone_presence_model_set_contact(LinphonePresenceModel *model, const char *contact) {
LinphonePresenceService *service;
if (model == NULL) return -1;
service = linphone_presence_model_get_nth_service(model, 0);
if (service == NULL) {
service = linphone_presence_service_new(NULL, LinphonePresenceBasicStatusClosed, NULL);
if (service == NULL) return -1;
linphone_presence_model_add_service(model, service);
}
return linphone_presence_service_set_contact(service, contact);
}
linphone_presence_model_get_nth_service
LinphonePresenceService * linphone_presence_model_get_nth_service(const LinphonePresenceModel *model, unsigned int idx) {
if ((model == NULL) || (idx >= linphone_presence_model_get_nb_services(model)))
return NULL;
return (LinphonePresenceService *)ms_list_nth_data(model->services, idx);
}
getActivity
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getActivity
* Signature: (J)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_linphone_core_PresenceModelImpl_getActivity(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
LinphonePresenceActivity *activity = linphone_presence_model_get_activity(model);
if (activity == NULL) return NULL;
RETURN_USER_DATA_OBJECT("PresenceActivityImpl", linphone_presence_activity, activity)
}
linphone_presence_model_get_activity
LinphonePresenceActivity * linphone_presence_model_get_activity(const LinphonePresenceModel *model) {
return linphone_presence_model_get_nth_activity(model, 0);
}
linphone_presence_model_get_nth_activity
LinphonePresenceActivity * linphone_presence_model_get_nth_activity(const LinphonePresenceModel *model, unsigned int idx) {
struct _get_activity_st st;
if ((model == NULL) || (idx >= linphone_presence_model_get_nb_activities(model)))
return NULL;
memset(&st, 0, sizeof(st));
st.requested_idx = idx;
ms_list_for_each2(model->persons, (MSIterate2Func)presence_model_get_activity, &st);
return st.activity;
}
setActivity
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: setActivity
* Signature: (JILjava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_setActivity(JNIEnv *env, jobject jobj, jlong ptr, jint acttype, jstring description) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
const char *cdescription = description ? env->GetStringUTFChars(description, NULL) : NULL;
jint res = (jint)linphone_presence_model_set_activity(model, (LinphonePresenceActivityType)acttype, cdescription);
if (cdescription) env->ReleaseStringUTFChars(description, cdescription);
return res;
}
linphone_presence_model_set_activity
int linphone_presence_model_set_activity(LinphonePresenceModel *model, LinphonePresenceActivityType acttype, const char *description) {
LinphonePresenceBasicStatus basic_status = LinphonePresenceBasicStatusOpen;
LinphonePresenceActivity *activity;
int err = 0;
if (model == NULL) return -1;
switch (acttype) {
case LinphonePresenceActivityAppointment:
case LinphonePresenceActivityBusy:
case LinphonePresenceActivityMeeting:
case LinphonePresenceActivityPermanentAbsence:
case LinphonePresenceActivityOffline:
case LinphonePresenceActivityWorship:
basic_status = LinphonePresenceBasicStatusClosed;
break;
default:
basic_status = LinphonePresenceBasicStatusOpen;
break;
}
if (linphone_presence_model_set_basic_status(model, basic_status) < 0) return -1;
linphone_presence_model_clear_activities(model);
activity = linphone_presence_activity_new(acttype, description);
if (activity == NULL) return -1;
err = linphone_presence_model_add_activity(model, activity);
linphone_presence_activity_unref(activity);
return err;
}
getNbActivities
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getNbActivities
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL Java_org_linphone_core_PresenceModelImpl_getNbActivities(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
return (jlong)linphone_presence_model_get_nb_activities(model);
}
linphone_presence_model_get_nb_activities
unsigned int linphone_presence_model_get_nb_activities(const LinphonePresenceModel *model) {
unsigned int nb = 0;
ms_list_for_each2(model->persons, (MSIterate2Func)presence_model_count_activities, &nb);
return nb;
}
getNthActivity
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getNthActivity
* Signature: (JJ)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_linphone_core_PresenceModelImpl_getNthActivity(JNIEnv *env, jobject jobj, jlong ptr, jlong idx) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
LinphonePresenceActivity *activity = linphone_presence_model_get_nth_activity(model, (unsigned int)idx);
if (activity == NULL) return NULL;
RETURN_USER_DATA_OBJECT("PresenceActivityImpl", linphone_presence_activity, activity)
}
linphone_presence_model_get_nth_activity
LinphonePresenceActivity * linphone_presence_model_get_nth_activity(const LinphonePresenceModel *model, unsigned int idx) {
struct _get_activity_st st;
if ((model == NULL) || (idx >= linphone_presence_model_get_nb_activities(model)))
return NULL;
memset(&st, 0, sizeof(st));
st.requested_idx = idx;
ms_list_for_each2(model->persons, (MSIterate2Func)presence_model_get_activity, &st);
return st.activity;
}
struct _get_activity_st {
unsigned int requested_idx;
unsigned int current_idx;
LinphonePresenceActivity *activity;
};
addActivity
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: addActivity
* Signature: (JILjava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_addActivity(JNIEnv *env, jobject jobj, jlong ptr, jlong activityPtr) {
return (jint)linphone_presence_model_add_activity((LinphonePresenceModel *)ptr, (LinphonePresenceActivity *)activityPtr);
}
linphone_presence_model_add_activity
int linphone_presence_model_add_activity(LinphonePresenceModel *model, LinphonePresenceActivity *activity) {
char *id = NULL;
LinphonePresencePerson *person = NULL;
if ((model == NULL) || (activity == NULL)) return -1;
if (ms_list_size(model->persons) == 0) {
/* There is no person in the presence model, add one. */
id = generate_presence_id();
person = presence_person_new(id, time(NULL));
if (id != NULL) ms_free(id);
if (person == NULL)
return -1;
presence_model_add_person(model, person);
} else {
/* Add the activity to the first person in the model. */
person = (LinphonePresencePerson *)ms_list_nth_data(model->persons, 0);
}
linphone_presence_person_add_activity(person, activity);
return 0;
}
clearActivities
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: clearActivities
* Signature: (J)I
*/
JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_clearActivities(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
return (jint)linphone_presence_model_clear_activities(model);
}
linphone_presence_model_clear_activities
int linphone_presence_model_clear_activities(LinphonePresenceModel *model) {
if (model == NULL) return -1;
ms_list_for_each(model->persons, (MSIterateFunc)linphone_presence_person_clear_activities);
return 0;
}
getNote
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getNote
* Signature: (JLjava/lang/String;)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_linphone_core_PresenceModelImpl_getNote(JNIEnv *env , jobject jobj, jlong ptr, jstring lang) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
const char *clang = lang ? env->GetStringUTFChars(lang, NULL) : NULL;
LinphonePresenceNote *note = linphone_presence_model_get_note(model, clang);
if (clang) env->ReleaseStringUTFChars(lang, clang);
if (note == NULL) return NULL;
RETURN_USER_DATA_OBJECT("PresenceNoteImpl", linphone_presence_note, note)
}
linphone_presence_model_get_note
LinphonePresenceNote * linphone_presence_model_get_note(const LinphonePresenceModel *model, const char *lang) {
struct _find_note_st st;
if (model == NULL) return NULL;
st.note = NULL;
if (lang != NULL) {
/* First try to find a note in the specified language exactly. */
st.lang = lang;
ms_list_for_each2(model->persons, (MSIterate2Func)find_presence_person_note, &st);
if (st.note == NULL) {
ms_list_for_each2(model->services, (MSIterate2Func)find_presence_service_note, &st);
}
if (st.note == NULL) {
st.note = find_presence_note_in_list(model->notes, lang);
}
}
if (st.note == NULL) {
/* No notes in the specified language has been found, try to find one without language. */
st.lang = NULL;
ms_list_for_each2(model->persons, (MSIterate2Func)find_presence_person_note, &st);
if (st.note == NULL) {
ms_list_for_each2(model->services, (MSIterate2Func)find_presence_service_note, &st);
}
if (st.note == NULL) {
st.note = find_presence_note_in_list(model->notes, NULL);
}
}
find_presence_note_in_list
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;
}
addNote
/*
* 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;
}
linphone_presence_note_new
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;
}
clearNotes
/*
* 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
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;
}
getNbServices
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getNbServices
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL Java_org_linphone_core_PresenceModelImpl_getNbServices(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
return (jlong)linphone_presence_model_get_nb_services(model);
}
linphone_presence_model_get_nb_services
unsigned int linphone_presence_model_get_nb_services(const LinphonePresenceModel *model) {
return ms_list_size(model->services);
}
getNthService
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getNthService
* Signature: (JJ)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_linphone_core_PresenceModelImpl_getNthService(JNIEnv *env, jobject jobj, jlong ptr, jlong idx) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
LinphonePresenceService *service = linphone_presence_model_get_nth_service(model, (unsigned int)idx);
if (service == NULL) return NULL;
RETURN_USER_DATA_OBJECT("PresenceServiceImpl", linphone_presence_service, service)
}
linphone_presence_model_get_nth_service
LinphonePresenceService * linphone_presence_model_get_nth_service(const LinphonePresenceModel *model, unsigned int idx) {
if ((model == NULL) || (idx >= linphone_presence_model_get_nb_services(model)))
return NULL;
return (LinphonePresenceService *)ms_list_nth_data(model->services, idx);
}
addService
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: addService
* Signature: (JJ)I
*/
JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_addService(JNIEnv *env, jobject jobj, jlong ptr, jlong servicePtr) {
return (jint)linphone_presence_model_add_service((LinphonePresenceModel *)ptr, (LinphonePresenceService *)servicePtr);
}
linphone_presence_model_add_service
int linphone_presence_model_add_service(LinphonePresenceModel *model, LinphonePresenceService *service) {
if ((model == NULL) || (service == NULL)) return -1;
model->services = ms_list_append(model->services, linphone_presence_service_ref(service));
return 0;
}
clearServices
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: clearServices
* Signature: (J)I
*/
JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_clearServices(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
return (jint)linphone_presence_model_clear_services(model);
}
linphone_presence_model_clear_services
int linphone_presence_model_clear_services(LinphonePresenceModel *model) {
if (model == NULL) return -1;
ms_list_for_each(model->services, (MSIterateFunc)linphone_presence_service_unref);
ms_list_free(model->services);
model->services = NULL;
return 0;
}
getNbPersons
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getNbPersons
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL Java_org_linphone_core_PresenceModelImpl_getNbPersons(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
return (jlong)linphone_presence_model_get_nb_persons(model);
}
linphone_presence_model_get_nb_persons
unsigned int linphone_presence_model_get_nb_persons(const LinphonePresenceModel *model) {
return ms_list_size(model->persons);
}
getNthPerson
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: getNthPerson
* Signature: (JJ)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_org_linphone_core_PresenceModelImpl_getNthPerson(JNIEnv *env, jobject jobj, jlong ptr, jlong idx) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
LinphonePresencePerson *person = linphone_presence_model_get_nth_person(model, (unsigned int)idx);
if (person == NULL) return NULL;
RETURN_USER_DATA_OBJECT("PresencePersonImpl", linphone_presence_person, person)
}
linphone_presence_model_get_nth_person
LinphonePresencePerson * linphone_presence_model_get_nth_person(const LinphonePresenceModel *model, unsigned int idx) {
if ((model == NULL) || (idx >= linphone_presence_model_get_nb_persons(model)))
return NULL;
return (LinphonePresencePerson *)ms_list_nth_data(model->persons, idx);
}
addPerson
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: addPerson
* Signature: (JJ)I
*/
JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_addPerson(JNIEnv *env, jobject jobj, jlong ptr, jlong personPtr) {
return (jint)linphone_presence_model_add_person((LinphonePresenceModel *)ptr, (LinphonePresencePerson *)personPtr);
}
linphone_presence_model_add_person
int linphone_presence_model_add_person(LinphonePresenceModel *model, LinphonePresencePerson *person) {
if ((model == NULL) || (person == NULL)) return -1;
model->persons = ms_list_append(model->persons, linphone_presence_person_ref(person));
return 0;
}
clearPersons
/*
* Class: org_linphone_core_PresenceModelImpl
* Method: clearPersons
* Signature: (J)I
*/
JNIEXPORT jint JNICALL Java_org_linphone_core_PresenceModelImpl_clearPersons(JNIEnv *env, jobject jobj, jlong ptr) {
LinphonePresenceModel *model = (LinphonePresenceModel *)ptr;
return (jint)linphone_presence_model_clear_persons(model);
}
linphone_presence_model_clear_persons
int linphone_presence_model_clear_persons(LinphonePresenceModel *model) {
if (model == NULL) return -1;
ms_list_for_each(model->persons, (MSIterateFunc)linphone_presence_person_unref);
ms_list_free(model->persons);
model->persons = NULL;
return 0;
}