FFOS cs call
来源:互联网 发布:linux查看当前进程 编辑:程序博客网 时间:2024/05/17 02:50
mozilla API参考网址
- 手机中的API与网站API的区别,手机中API比mozilla网站API 多了通信模块等其他手机需要的API接口,这部分mozilla已经不提供更新的帮助,只能靠自己设计(基于高通平台)
cs call
dialer
- path:apps/apps/communications/dialer/
- 入口:apps/apps/communications/manifest.webapp
"entry_points": { "dialer": { "launch_path": "/dialer/index.html#keyboard-view", //dialer 启动入口 keyboard-view是id "name": "Phone" ... },
- apps/apps/communications/dialer/js/keyboard_view.js
var KeyboardView = { /** * 监听keydown 确定call 事件 */ _initActionList: function kb_initActionMenu() { ... var config = { contexts: { ... 'dialed_number': { items: [{ l10nId: 'call', method: function() { self._makeCall(KeypadManager.phoneNumber());//打电话-> } ... }] }, }; ... }, _makeCall: function kb_makeCall(phoneNumber) { if (phoneNumber.length > 0) { LazyLoader.load([ '/shared/js/sim_settings_helper.js', ], function loaded() { SimSettingsHelper.getCardIndexFrom('outgoingCall', function(defaultCardIndex) { CallHandler.call(phoneNumber, defaultCardIndex);//callhandler 处理call-> }); }); } }};
- apps/apps/communications/dialer/js/dialer.js
var CallHandler = (function callHandler() { /* === Calls === */ function call(number, cardIndex) { var activity = null; /** *工程模式判断 */ /** * MMI code 判断 */ /** * 更新号码显示 */ /** * 出错判断 */ /** * 使用telephony 接口 拨打电话 */ LazyLoader.load(['/shared/js/dialer/telephony_helper.js'], function() { TelephonyHelper.call( number, cardIndex, oncall, connected, disconnected, error); }); }})();
- gaia/gaia/shared/js/dialer/telephony_helper.js
var TelephonyHelper = (function() { var call = function t_call(number, cardIndex, oncall, onconnected, ondisconnected, onerror) { /*过滤非法数字*/ var conn = navigator.mozMobileConnections && navigator.mozMobileConnections[cardIndex];//判断语音 数据连接 if (!conn || !conn.voice) { // No voice connection, the call won't make it loadTelephonyMessages(function() { TelephonyMessages.displayMessage('NoNetwork');//无网络的判断语音和数据连接 }); return; } startDial(cardIndex, conn, sanitizedNumber, oncall, onconnected, ondisconnected, onerror); }; function startDial(cardIndex, conn, sanitizedNumber, oncall, onconnected, ondisconnected, onerror) { ... var telephony = navigator.mozTelephony; /** * 判断SIM卡的状态 */ LazyLoader.load('/shared/js/icc_helper.js', function() { ... /** * 判断sim卡unknow 还是 illegal */ /** * 判断是否仅支持紧急号码 */ // If the mobileConnection has a sim card we let gecko take the // default service, otherwise we force the first slot. ... callPromise = telephony.dial(baseNumber, cardIndex);//调用webidl接口 进入gecko }); }})();
- gecko/gecko/dom/webidl/Telephony.webidl
/** * Make a phone call or send the mmi code depending on the number provided. * * TelephonyCall - for call setup * MMICall - for MMI code */ [Throws] Promise<(TelephonyCall or MMICall)> dial(DOMString number, optional unsigned long serviceId); [Throws] Promise<TelephonyCall> dialEmergency(DOMString number, optional unsigned long serviceId);
- gecko/gecko/dom/telephony/Telephony.cpp
// Telephony WebIDLalready_AddRefed<Promise>Telephony::Dial(const nsAString& aNumber, const Optional<uint32_t>& aServiceId, ErrorResult& aRv){ uint32_t serviceId = GetServiceId(aServiceId); RefPtr<Promise> promise = DialInternal(serviceId, aNumber, false, aRv);// --->dial return promise.forget();}already_AddRefed<Promise>Telephony::DialEmergency(const nsAString& aNumber, const Optional<uint32_t>& aServiceId, ErrorResult& aRv){ uint32_t serviceId = GetServiceId(aServiceId); RefPtr<Promise> promise = DialInternal(serviceId, aNumber, true, aRv); return promise.forget();}}already_AddRefed<Promise>Telephony::DialInternal(uint32_t aServiceId, const nsAString& aNumber, bool aEmergency, ErrorResult& aRv){... nsCOMPtr<nsITelephonyDialCallback> callback = new TelephonyDialCallback(GetOwner(), this, promise); nsresult rv = mService->Dial(aServiceId, aNumber, aEmergency, callback);//---> service dial... return promise.forget();}// static 初始化时获取servicealready_AddRefed<Telephony>Telephony::Create(nsPIDOMWindowInner* aOwner, ErrorResult& aRv){ nsCOMPtr<nsITelephonyService> ril = do_GetService(TELEPHONY_SERVICE_CONTRACTID); RefPtr<Telephony> telephony = new Telephony(aOwner); telephony->mService = ril; telephony->mListener = new Listener(telephony); telephony->mCallsList = new CallsList(telephony); telephony->mGroup = TelephonyCallGroup::Create(telephony);}
- gecko/gecko/dom/telephony/nsITelephonyService.idl
/** * Functionality for making and managing phone calls. */ void dial(in unsigned long clientId, in DOMString number, in boolean isEmergency, in nsITelephonyDialCallback callback);
- GENERATED FROM nsITelephonyService.idl to nsITelephonyService.h
- out/out/target/product/msm8909_512/obj/objdir-gecko/dist/include/nsITelephonyService.h
- 通过 include 头文件启用vendor 的内容
- vendor/vendor/qcom/proprietary/b2g_telephony/nsTelephonyService.cpp
NS_IMETHODIMP nsTelephonyService::Dial(uint32_t clientId, const nsAString &number, bool isEmergency, nsITelephonyDialCallback *callback) { Phone* phone = GetPhoneByClientId(clientId); if ((nullptr == callback) || (nullptr == phone)) { QLOGW("Dial called with bad parameters"); return NS_ERROR_INVALID_ARG; } phone->Dial(number, isEmergency, new TelephonyCbHelper(callback));//--> dial return NS_OK;}
- vendor/vendor/qcom/proprietary/b2g_telephony/Phone.cpp
void Phone::Dial(const nsAString& dialString, bool isDialEmergency, TelephonyCbHelper* cbHelper) { // Both CLIR mode and dialing number may get modified when calling ProcessMmi // if the dialing string is a temporary mode CLIR request int tempClirMode = CLIR_DEFAULT; nsString dialingNumber(dialString); // If not on CDMA (i.e. when camped on GSM or IMS), then check if the dialing // request is an MMI code. if (!IsRatTypeCdma() || IsImsInService()) { if (mSuplServices->ProcessMmi(dialingNumber, tempClirMode, cbHelper)) { // Dial request was handled as a MMI request return; } } // Make a normal dial request mCallTracker->Dial(dialingNumber, isDialEmergency, tempClirMode, //-->dial ims::CALL_DOMAIN_UNKNOWN, cbHelper);}
- vendor/vendor/qcom/proprietary/b2g_telephony/CallTracker.cpp
/** * Called by content process to dial a call */void CallTracker::Dial(nsString& dialString, bool isDialEmergency, int clirMode, ims::CallDomain domain, TelephonyCbHelper* cbHelper) { ... if (mPendingMO->mAddress.IsEmpty()) { QLOGE("Phone number is invalid"); mPendingMO->OnDisconnect(DISCONNECT_CAUSE_UNOBTAINABLE_NUMBER); mForegroundCall.ClearDisconnected(); // Remove dialing call; go to Idle mPendingMO = nullptr; // Release the dialing call } else if (!isDialRequestPending) { // if isDialRequestPending is true, we postpone the dial // request for the second call till we get the hold confirmation // for the first call. QLOGV("Dialing %s %d", NSSTRING_TO_CSTR(dialString), mPendingMO->GetState()); if ((mState != PHONE_STATE_IDLE) && !mForegroundCall.IsIms() && mPhone->IsRatTypeCdma()) { mRil->SendCdmaFlash(this, NSCSTRING_TO_CSTR_NC(mPendingMO->mAddress)); } else { mClirMode = clirMode; DialPendingCall(); //--> CT dial } } UpdatePhoneState();}/** * Dial the call after the result of switch command is * received */void CallTracker::DialPendingCall() { ... mRil->Dial(this, NSCSTRING_TO_CSTR_NC(mPendingMO->mAddress), mClirMode);//Ril dial ... UpdatePhoneState();}
- RIL vendor/vendor/qcom/proprietary/b2g_telephony/RIL.cpp
/** * Send the dial request to RIL */void RIL::Dial(RilResponseHandler* handler, const char* address, int clirMode, void* userObj) { RildRequest* rr = RildRequest::Obtain(RIL_REQUEST_DIAL, handler, userObj); WriteStringToParcel(rr->mParcel, address); rr->mParcel.writeInt32(clirMode); rr->mParcel.writeInt32(0); // UUS info is not supported SUB_QRLOGD("[%04d]> %s", rr->mSerial, RequestToString(rr->mRequest)); Send(rr);}/** * Add the request to the pending request queue and send * the data to the rild socket using the RILSender * runnable on the {@code mRilSenderThread} */void RIL::Send(RilRequest* rilRequest) { // Add the request to the pending request list pthread_mutex_lock(&mPendingRequestsMutex); mPendingRequests.insertFront(new RilRequestListItem(rilRequest)); pthread_mutex_unlock(&mPendingRequestsMutex);#ifdef ENABLE_TEST_FRAMEWORK if (mTestCallback != nullptr) { RefPtr<nsRunnable> runnable = new TestRequestInterceptor(this, rilRequest); NS_DispatchToMainThread(runnable); } else { DispatchToRil(rilRequest); }#else DispatchToRil(rilRequest);//--> dispatch to ril#endif}/** * Dispatch the RIL request to sender thread */void RIL::DispatchToRil(RilRequest* rilRequest) { RefPtr<nsRunnable> event = new RilSender(this, rilRequest); mRilSenderThread->Dispatch(event, nsIEventTarget::DISPATCH_NORMAL);//---> Rilsender send}/*============= Implementation of Class RilSender =============*//** * RilSender constructor */RilSender::RilSender(RIL* ril, RilRequest* rilRequest) : mRil(ril), mRilRequest(rilRequest) { switch (rilRequest->mSocketId) { case SOCKETID_OEM: mSocket = ril->mOemSocket;//cs call mOemSocket = new RilSocket(..) break; case SOCKETID_IMS: mSocket = ril->mImsSocket;//ps call break; default: mSocket = ril->mRildSocket; }}/** * Send data to rild socket */NS_IMETHODIMP RilSender::Run() { uint32_t header; const void *data = mRilRequest->Data(); size_t dataSize = mRilRequest->DataSize(); int ret; ... pthread_mutex_lock(&mRil->mWriteMutex); // Send payload size header = htonl(dataSize); ret = BlockingWrite((void *)&header, sizeof(header)); if (ret < 0) { pthread_mutex_unlock(&mRil->mWriteMutex); goto error; } // Send payload ret = BlockingWrite(data, dataSize);// 写数据到rild if (ret < 0) { pthread_mutex_unlock(&mRil->mWriteMutex); goto error; } pthread_mutex_unlock(&mRil->mWriteMutex); return NS_OK; ...}/** * Writes the data to the socket and blocks until all the data * is sent */int RilSender::BlockingWrite(const void *buffer, size_t len) { size_t writeOffset = 0; const uint8_t *toWrite; toWrite = (const uint8_t *)buffer; while (writeOffset < len) { ssize_t written; do { written = write (mSocket->mFd, toWrite + writeOffset, len - writeOffset);// --->写数据 } while (written < 0 && ((errno == EINTR) || (errno == EAGAIN))); if (written >= 0) { writeOffset += written; } else { // written < 0 QRLOGE("[SUB%d] RIL Response: unexpected error on write errno:%d", mRil->mClientId, errno); mSocket->Close(); return -1; } } return 0;}//socket 连接的文件/* RilSocket related defines */NS_NAMED_LITERAL_CSTRING(RILD_SOCKET_NAME, "rild");NS_NAMED_LITERAL_CSTRING(RILD_OEM_SOCKET_NAME, "qmux_radio/rild_oem");NS_NAMED_LITERAL_CSTRING(IMS_SOCKET_NAME, "qmux_radio/rild_ims");
作者:贱贱的杨
从此你们的路上不会孤单,还有贱贱的我
阅读全文
0 0
- FFOS cs call
- cs call
- call cs iub wireshark analysis
- FFOS introduction
- FFOS rilworker parcels 解析
- FFOS dial from launch
- 创建FFOS 应用
- ffos下DTV开发总结
- FFOS 1.3 enable fdn 流程图
- CS..........................
- cs
- cs
- cs
- Cs
- cs
- cs
- cs
- CS
- JavaScript中正则表达式常见使用函数
- Set 小结
- 解决EasyUI的datagrid控件显示日期问题
- bzoj 4498 魔法的碰撞
- java取整和java四舍五入方法 BigDecimal.setScale()方法详解.
- FFOS cs call
- android binder机制---Java层获取ServiceManager
- 拜小白教你OpenCV3.2.0+VS2017开发环境配置
- 初识Kafka----个人理解,希望对喜欢kafka的朋友有帮助
- 关于Spring的@Profile注解的使用记录
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- jsp无法传值到jsp或者ajax无法post到servlet
- Java学习轨迹【面向对象(1)】
- Unity3D:延时方法Invoke和InvokeRepeating