📄 contactsmodule.cpp
字号:
/*
* ====================================================================
* contactsmodule.cpp
*
*
* Copyright (c) 2006-2007 Nokia Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* ====================================================================
*/
#include "contactsmodule.h"
#ifdef CONTACTS_MAINTENANCE
#include <cpbkcontactengine.h>
#endif
//////////////GENERAL FUNCTIONS///////////////
/*
* Tests if the contact entry is a contact group.
*/
TBool IsContactGroup(CContactItem& item)
{
if(item.Type().iUid==KContactGroupTypeId){
return ETrue;
}
return EFalse;
};
//////////////TYPE METHODS///////////////
/*
* Module methods.
*/
/*
* Opens the database and creates and returns a ContactsDb-object.
*
* open() - opens the default contact database file
* open(u'filename') - opens file if it exists.
* open(u'filename', 'c') - opens file, creates if the file does not exist.
* open(u'filename', 'n') - creates new empty database file.
*/
extern "C" PyObject *
open_db(PyObject* /*self*/, PyObject *args)
{
PyObject* filename = NULL;
char* flag = NULL;
TInt userError = KErrNone;
CContactDatabase* contactDatabase = NULL;
if (!PyArg_ParseTuple(args, "|Us", &filename, &flag)){
return NULL;
}
TRAPD(error, {
if(!flag){
if(!filename){
// Open default db file.
if(CContactDatabase::DefaultContactDatabaseExistsL()==EFalse){
contactDatabase = CContactDatabase::CreateL();
}else{
contactDatabase = CContactDatabase::OpenL();
}
}else{
// Open given db file, raise exception if the file does not exist.
TPtrC filenamePtr((TUint16*) PyUnicode_AsUnicode(filename), PyUnicode_GetSize(filename));
contactDatabase = CContactDatabase::OpenL(filenamePtr);
}
}else{
if(filename && flag[0] == 'c'){
// Open, create if file doesn't exist.
TPtrC filenamePtr((TUint16*) PyUnicode_AsUnicode(filename), PyUnicode_GetSize(filename));
if(EFalse != CContactDatabase::ContactDatabaseExistsL(filenamePtr)){
contactDatabase = CContactDatabase::OpenL(filenamePtr);
}else{
contactDatabase = CContactDatabase::CreateL(filenamePtr);
}
}else if(filename && flag[0] == 'n'){
// Create a new empty file.
TPtrC filenamePtr((TUint16*) PyUnicode_AsUnicode(filename), PyUnicode_GetSize(filename));
contactDatabase = CContactDatabase::ReplaceL(filenamePtr);
}else{
// Illegal parameter combination.
userError = 1;
}
}
});
if(error != KErrNone){
return SPyErr_SetFromSymbianOSErr(error);
}
if(userError == 1){
PyErr_SetString(PyExc_SyntaxError, "illegal parameter combination");
return NULL;
}
return new_ContactsDb_object(contactDatabase);
}
#ifdef CONTACTS_MAINTENANCE
/*
* For maintenance and testing only.
*/
extern "C" PyObject *
_create_api_mappings()
{
TInt error = KErrNone;
CPbkContactEngine* contactEngine = NULL;
PyObject* fieldDataList = NULL;
TRAP(error, {
contactEngine = CPbkContactEngine::NewL();
});
if(error!=KErrNone){
return SPyErr_SetFromSymbianOSErr(error);
}
const CPbkFieldsInfo& fieldsInfo = contactEngine->FieldsInfo();
fieldDataList = PyList_New(fieldsInfo.Count());
if (fieldDataList == NULL){
delete contactEngine;
return PyErr_NoMemory();
}
for(TInt i=0; i<fieldsInfo.Count();i++){
PyObject* idList = NULL;
idList = PyList_New(fieldsInfo[i]->ContentType().FieldTypeCount());
if(idList==NULL){
Py_DECREF(fieldDataList);
delete contactEngine;
return PyErr_NoMemory();
}
for(TInt j=0;j<fieldsInfo[i]->ContentType().FieldTypeCount();j++){
PyObject* id = NULL;
id = Py_BuildValue("i",fieldsInfo[i]->ContentType().FieldType(j));
if((id==NULL) || (PyList_SetItem(idList,j,id)!=0)){
Py_DECREF(idList);
Py_DECREF(fieldDataList);
delete contactEngine;
return NULL;
}
}
PyObject* infoDict = NULL;
infoDict =
Py_BuildValue("{s:u#,s:i,s:i,s:i,s:O}",
(const char*)(&KKeyStrFieldName)->Ptr(), fieldsInfo[i]->FieldName().Ptr(),
fieldsInfo[i]->FieldName().Length(),
(const char*)(&KKeyStrFieldId)->Ptr(), fieldsInfo[i]->FieldId(),
(const char*)(&KKeyStrFieldLocation)->Ptr(), fieldsInfo[i]->Location(),
"vcard_mapping", fieldsInfo[i]->ContentType().Mapping(),
"ids", idList
);
Py_DECREF(idList);
if (infoDict == NULL){
Py_DECREF(fieldDataList);
delete contactEngine;
return NULL;
}
error = PyList_SetItem(fieldDataList, i, infoDict);
if(error!=0){
Py_DECREF(fieldDataList);
delete contactEngine;
return NULL;
}
}
delete contactEngine;
return fieldDataList;
}
#endif
/*
* Create new ContactsDb object.
*/
extern "C" PyObject *
new_ContactsDb_object(CContactDatabase* contactDatabase)
{
ContactsDb_object* contactsDb =
PyObject_New(ContactsDb_object, ContactsDb_type);
if (contactsDb == NULL){
delete contactDatabase;
return PyErr_NoMemory();
}
contactsDb->contactDatabase = contactDatabase;
return (PyObject*) contactsDb;
}
/*
* ContactsDb methods.
*/
/*
* Returns contact object (indicated by unique id given)
*/
static PyObject *
ContactsDb_get_entry(ContactsDb_object *self, PyObject *args)
{
TInt32 uniqueId = -1;
if (!PyArg_ParseTuple(args, "i", &uniqueId)){
return NULL;
}
if((uniqueId == KNullContactId) || (uniqueId == self->contactDatabase->TemplateId())){
PyErr_SetString(PyExc_ValueError, "illegal contact id");
return NULL;
}
return new_Contact_object(self, uniqueId);
}
/*
* Create new contact entry.
*/
static PyObject *
ContactsDb_create_entry(ContactsDb_object *self, PyObject* /*args*/)
{
return new_Contact_object(self, KNullContactId);
}
/*
* Searches contacts by string (match is detected if the string is
* a substring of some field value of the contact).
* Returns tuple of unique contact ID:s representing contact entrys
* matching the criteria.
*/
extern "C" PyObject *
ContactsDb_find(ContactsDb_object* self, PyObject *args)
{
TInt error = KErrNone;
PyObject* searchString = NULL;
CContactIdArray* idArray = NULL;
PyObject* fieldIdTuple = NULL;
CContactItemFieldDef* selectedFieldIds = NULL;
PyObject* idArrayTuple = NULL;
if (!PyArg_ParseTuple(args, "UO!",
&searchString, &PyTuple_Type, &fieldIdTuple)){
return NULL;
}
if(PyTuple_Size(fieldIdTuple)<=0){
PyErr_SetString(PyExc_RuntimeError, "no field types specified");
return NULL;
}
TPtrC searchStringPtr((TUint16*) PyUnicode_AsUnicode(searchString),
PyUnicode_GetSize(searchString));
TRAP(error, {
selectedFieldIds = new (ELeave) CContactItemFieldDef;
});
if(error != KErrNone){
return SPyErr_SetFromSymbianOSErr(error);
}
TRAP(error, {
for(TInt i=0;i<PyTuple_Size(fieldIdTuple);i++){
PyObject* fieldIdItem = PyTuple_GetItem(fieldIdTuple, i);
TInt fieldId = PyInt_AsLong(fieldIdItem);
selectedFieldIds->AppendL(TUid::Uid(fieldId));
}
idArray = self->contactDatabase->FindLC(searchStringPtr, selectedFieldIds);
CleanupStack::Pop(idArray);
});
selectedFieldIds->Reset();
delete selectedFieldIds;
if(error!=KErrNone){
return SPyErr_SetFromSymbianOSErr(error);
}
idArrayTuple = PyTuple_New(idArray->Count());
if (idArrayTuple == NULL){
idArray->Reset();
delete idArray;
return PyErr_NoMemory();
}
for(TInt i=0; i<idArray->Count(); i++){
PyObject* entryId = Py_BuildValue("i", (*idArray)[i]);
if (entryId == NULL){
idArray->Reset();
delete idArray;
Py_DECREF(idArrayTuple);
return NULL;
}
if(PyTuple_SetItem(idArrayTuple, i, entryId)<0){
Py_DECREF(idArrayTuple);
idArray->Reset();
delete idArray;
return NULL;
}
}
idArray->Reset();
delete idArray;
return (PyObject*)idArrayTuple;
}
/*
* Returns id:s of contact groups in a list.
*/
extern "C" PyObject *
ContactsDb_contact_groups(ContactsDb_object* self, PyObject* /*args*/)
{
TInt error = KErrNone;
CContactIdArray* idArray = NULL;
PyObject* idList = NULL;
TRAP(error, {
idArray = self->contactDatabase->GetGroupIdListL();
});
if(error!=KErrNone){
return SPyErr_SetFromSymbianOSErr(error);
}
idList = PyList_New(idArray->Count());
if(idList==NULL){
idArray->Reset();
delete idArray;
return PyErr_NoMemory();
}
for(TInt i=0;i<idArray->Count();i++){
PyObject* id = Py_BuildValue("i", (*idArray)[i]);
if(id==NULL){
idArray->Reset();
delete idArray;
Py_DECREF(idList);
return NULL;
}
if(PyList_SetItem(idList, i, id)!=0){
idArray->Reset();
delete idArray;
Py_DECREF(idList);
return NULL;
}
}
idArray->Reset();
delete idArray;
return idList;
}
/*
* Returns name/label of specified contact group.
*/
extern "C" PyObject *
ContactsDb_contact_group_label(ContactsDb_object* self, PyObject *args)
{
TInt error = KErrNone;
PyObject* label = NULL;
TInt32 entryId = -1;
CContactItem* item = NULL;
if (!PyArg_ParseTuple(args, "i", &entryId)){
return NULL;
}
TRAP(error, {
item = self->contactDatabase->ReadContactL(entryId);
});
if(error!=KErrNone){
return SPyErr_SetFromSymbianOSErr(error);
}
if(IsContactGroup(*item)==EFalse){
delete item;
PyErr_SetString(PyExc_RuntimeError, "not a contact group");
return NULL;
}
CContactGroup* group = dynamic_cast<CContactGroup*>(item);
TRAP(error, {
label = Py_BuildValue("u#",group->GetGroupLabelL().Ptr(),group->GetGroupLabelL().Length());
});
delete item;
if(error!=KErrNone){
return SPyErr_SetFromSymbianOSErr(error);
}
return label;
}
/*
* Sets name/label of the specified contact group.
*/
extern "C" PyObject *
ContactsDb_contact_group_set_label(ContactsDb_object* self, PyObject *args)
{
TInt error = KErrNone;
PyObject* label = NULL;
TInt32 entryId = -1;
CContactItem* item = NULL;
if (!PyArg_ParseTuple(args, "iU", &entryId, &label)){
return NULL;
}
TRAP(error, {
item = self->contactDatabase->OpenContactL(entryId);
});
if(error!=KErrNone){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -