⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contactsmodule.cpp

📁 python s60 1.4.5版本的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*
 * ====================================================================
 * 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 + -