| // Copyright 2015 the V8 project authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "src/inspector/remote-object-id.h" | 
 |  | 
 | #include "../../third_party/inspector_protocol/crdtp/json.h" | 
 | #include "src/inspector/protocol/Protocol.h" | 
 | #include "src/inspector/string-util.h" | 
 |  | 
 | namespace v8_inspector { | 
 |  | 
 | namespace { | 
 |  | 
 | String16 serializeId(uint64_t isolateId, int injectedScriptId, int id) { | 
 |   return String16::concat( | 
 |       String16::fromInteger64(static_cast<int64_t>(isolateId)), ".", | 
 |       String16::fromInteger(injectedScriptId), ".", String16::fromInteger(id)); | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | RemoteObjectIdBase::RemoteObjectIdBase() | 
 |     : m_isolateId(0), m_injectedScriptId(0), m_id(0) {} | 
 |  | 
 | bool RemoteObjectIdBase::parseId(const String16& objectId) { | 
 |   const UChar dot = '.'; | 
 |   size_t firstDotPos = objectId.find(dot); | 
 |   if (firstDotPos == String16::kNotFound) return false; | 
 |   bool ok = false; | 
 |   int64_t isolateId = objectId.substring(0, firstDotPos).toInteger64(&ok); | 
 |   if (!ok) return false; | 
 |   firstDotPos++; | 
 |   size_t secondDotPos = objectId.find(dot, firstDotPos); | 
 |   if (secondDotPos == String16::kNotFound) return false; | 
 |   int injectedScriptId = | 
 |       objectId.substring(firstDotPos, secondDotPos - firstDotPos) | 
 |           .toInteger(&ok); | 
 |   if (!ok) return false; | 
 |   secondDotPos++; | 
 |   int id = objectId.substring(secondDotPos).toInteger(&ok); | 
 |   if (!ok) return false; | 
 |   m_isolateId = static_cast<uint64_t>(isolateId); | 
 |   m_injectedScriptId = injectedScriptId; | 
 |   m_id = id; | 
 |   return true; | 
 | } | 
 |  | 
 | Response RemoteObjectId::parse(const String16& objectId, | 
 |                                std::unique_ptr<RemoteObjectId>* result) { | 
 |   std::unique_ptr<RemoteObjectId> remoteObjectId(new RemoteObjectId()); | 
 |   if (!remoteObjectId->parseId(objectId)) | 
 |     return Response::ServerError("Invalid remote object id"); | 
 |   *result = std::move(remoteObjectId); | 
 |   return Response::Success(); | 
 | } | 
 |  | 
 | String16 RemoteObjectId::serialize(uint64_t isolateId, int injectedScriptId, | 
 |                                    int id) { | 
 |   return serializeId(isolateId, injectedScriptId, id); | 
 | } | 
 |  | 
 | Response RemoteCallFrameId::parse(const String16& objectId, | 
 |                                   std::unique_ptr<RemoteCallFrameId>* result) { | 
 |   std::unique_ptr<RemoteCallFrameId> remoteCallFrameId(new RemoteCallFrameId()); | 
 |   if (!remoteCallFrameId->parseId(objectId)) | 
 |     return Response::ServerError("Invalid call frame id"); | 
 |   *result = std::move(remoteCallFrameId); | 
 |   return Response::Success(); | 
 | } | 
 |  | 
 | String16 RemoteCallFrameId::serialize(uint64_t isolateId, int injectedScriptId, | 
 |                                       int frameOrdinal) { | 
 |   return serializeId(isolateId, injectedScriptId, frameOrdinal); | 
 | } | 
 |  | 
 | }  // namespace v8_inspector |