void MediaWindow::SmartNode::SetTo(const dormant_node_info* info) { _FreeNode(); if (!info) return; fNode = new media_node(); BMediaRoster* roster = BMediaRoster::Roster(); status_t status = B_OK; media_node_id node_id; if (roster->GetInstancesFor(info->addon, info->flavor_id, &node_id) == B_OK) status = roster->GetNodeFor(node_id, fNode); else status = roster->InstantiateDormantNode(*info, fNode, B_FLAVOR_IS_GLOBAL); if (status != B_OK) { fprintf(stderr, "SmartNode::SetTo error with node %" B_PRId32 ": %s\n", fNode->node, strerror(status)); } status = roster->StartWatching(fMessenger, *fNode, B_MEDIA_WILDCARD); if (status != B_OK) { fprintf(stderr, "SmartNode::SetTo can't start watching for" " node %" B_PRId32 "\n", fNode->node); } }
void MediaWindow::SmartNode::SetTo(const media_node& node) { _FreeNode(); fNode = new media_node(node); BMediaRoster* roster = BMediaRoster::Roster(); roster->StartWatching(fMessenger, *fNode, B_MEDIA_WILDCARD); }
VJSStructuredClone* VJSStructuredClone::RetainCloneForVBagArray( const XBOX::VBagArray& inBagArray, bool inUniqueElementsAreNotArrays) { VJSStructuredClone *structuredClone = NULL; SNode *arrayNode = _VBagArrayToNode( inBagArray, inUniqueElementsAreNotArrays); if (arrayNode != NULL) { arrayNode->fNextSibling = NULL; if ((structuredClone = new VJSStructuredClone()) != NULL) structuredClone->fRoot = arrayNode; else _FreeNode( arrayNode); } return structuredClone; }
VJSStructuredClone* VJSStructuredClone::RetainCloneForVValueSingle( const XBOX::VValueSingle& inValue) { VJSStructuredClone *structuredClone = NULL; SNode *valueNode = _VValueSingleToNode( inValue); if (valueNode != NULL) { valueNode->fNextSibling = NULL; if ((structuredClone = new VJSStructuredClone()) != NULL) structuredClone->fRoot = valueNode; else _FreeNode( valueNode); } return structuredClone; }
VJSStructuredClone* VJSStructuredClone::RetainCloneForVValueBag( const XBOX::VValueBag& inBag, bool inUniqueElementsAreNotArrays) { VJSStructuredClone *structuredClone = NULL; SNode *bagNode = _VValueBagToNode( inBag, inUniqueElementsAreNotArrays); if (bagNode != NULL) { bagNode->fNextSibling = NULL; if ((structuredClone = new VJSStructuredClone()) != NULL) structuredClone->fRoot = bagNode; else _FreeNode( bagNode); } return structuredClone; }
void MediaWindow::SmartNode::SetTo(const dormant_node_info* info) { _FreeNode(); if (!info) return; fNode = new media_node(); BMediaRoster* roster = BMediaRoster::Roster(); // TODO: error codes media_node_id node_id; if (roster->GetInstancesFor(info->addon, info->flavor_id, &node_id) == B_OK) roster->GetNodeFor(node_id, fNode); else roster->InstantiateDormantNode(*info, fNode, B_FLAVOR_IS_GLOBAL); roster->StartWatching(fMessenger, *fNode, B_MEDIA_WILDCARD); }
VJSStructuredClone::SNode *VJSStructuredClone::_ValueToNode (XBOX::VJSValue inValue, std::map<JS4D::ValueRef, SNode *> *ioAlreadyCloned, std::list<SEntry> *ioToDoList) { xbox_assert(ioAlreadyCloned != NULL && ioToDoList != NULL); SNode *p; if ((p = new SNode()) == NULL) return NULL; switch (inValue.GetType()) { case JS4D::eTYPE_UNDEFINED: p->fType = eNODE_UNDEFINED; break; case JS4D::eTYPE_NULL: p->fType = eNODE_NULL; break; case JS4D::eTYPE_BOOLEAN: p->fType = eNODE_BOOLEAN; if (!inValue.GetBool(&p->fValue.fBoolean)) { delete p; p = NULL; } break; case JS4D::eTYPE_NUMBER: p->fType = eNODE_NUMBER; if (!inValue.GetReal(&p->fValue.fNumber)) { delete p; p = NULL; } break; case JS4D::eTYPE_STRING: { XBOX::VString string; p->fType = eNODE_STRING; if (!inValue.GetString(string) || (p->fValue.fString = new XBOX::VString(string)) == NULL) { delete p; p = NULL; } break; } case JS4D::eTYPE_OBJECT: { std::vector<VJSValue> emptyArgument; XBOX::VString string; if (inValue.IsInstanceOf("Boolean")) { p->fType = eNODE_BOOLEAN_OBJECT; if (!inValue.GetObject().CallMemberFunction("valueOf", &emptyArgument, &inValue, NULL) || !inValue.GetBool(&p->fValue.fBoolean)) { delete p; p = NULL; } } else if (inValue.IsInstanceOf("Number")) { p->fType = eNODE_NUMBER_OBJECT; if (!inValue.GetObject().CallMemberFunction("valueOf", &emptyArgument, &inValue, NULL) || !inValue.GetReal(&p->fValue.fNumber)) { delete p; p = NULL; } } else if (inValue.IsInstanceOf("String")) { p->fType = eNODE_STRING_OBJECT; if (!inValue.GetObject().CallMemberFunction("valueOf", &emptyArgument, &inValue, NULL) || !inValue.GetString(string) || (p->fValue.fString = new XBOX::VString(string)) == NULL) { delete p; p = NULL; } } else if (inValue.IsInstanceOf("Date")) { // getTime() will return the date as milliseconds since 1-01-1970 (UNIX time). p->fType = eNODE_DATE_OBJECT; if (!inValue.GetObject().CallMemberFunction("getTime", &emptyArgument, &inValue, NULL) || !inValue.GetReal(&p->fValue.fNumber)) { delete p; p = NULL; } } else if (inValue.IsInstanceOf("RegExp")) { // toString() will return the "complete" (along with modifier flag(s)) regular expression. p->fType = eNODE_REG_EXP_OBJECT; if (!inValue.GetObject().CallMemberFunction("toString", &emptyArgument, &inValue, NULL) || !inValue.GetString(string) || (p->fValue.fString = new XBOX::VString(string)) == NULL) { delete p; p = NULL; } } else if (_IsSerializable(inValue)) { // Serialize object if possible. p->fType = eNODE_SERIALIZABLE; if ((p->fValue.fSerializationData.fConstructorName = new XBOX::VString()) == NULL) { delete p; p = NULL; } else if ((p->fValue.fSerializationData.fJSON = new XBOX::VString()) == NULL) { delete p->fValue.fSerializationData.fConstructorName; delete p; p = NULL; } else { if (!inValue.GetObject().GetPropertyAsString("constructorName", NULL, *p->fValue.fSerializationData.fConstructorName) || !inValue.GetObject().CallMemberFunction("serialize", &emptyArgument, &inValue, NULL) || !inValue.GetString(*p->fValue.fSerializationData.fJSON)) { _FreeNode(p); p = NULL; } } } else if (inValue.IsFunction()) { delete p; p = NULL; } else { // Object or Array. std::map<JS4D::ValueRef, SNode *>::iterator j; if ((j = ioAlreadyCloned->find(inValue.GetValueRef())) != ioAlreadyCloned->end()) { // Already cloned. xbox_assert(inValue.IsObject()); p->fType = eNODE_REFERENCE; p->fValue.fReference = j->second; } else { SEntry entry; p->fType = inValue.IsArray() ? eNODE_ARRAY : eNODE_OBJECT; p->fValue.fFirstChild = NULL; // Mark as already cloned and add to "todo" list. (*ioAlreadyCloned)[inValue.GetValueRef()] = p; entry.fValueRef = inValue.GetValueRef(); entry.fNode = p; ioToDoList->push_back(entry); } } break; } default: xbox_assert(false); break; } return p; }
VJSStructuredClone::~VJSStructuredClone () { if (fRoot != NULL) _FreeNode(fRoot); }
USING_TOOLBOX_NAMESPACE VJSStructuredClone *VJSStructuredClone::RetainClone (XBOX::VJSValue inValue) { std::map<JS4D::ValueRef, SNode *> alreadyCreated; std::list<SEntry> toDoList; SNode *root; if ((root = _ValueToNode(inValue, &alreadyCreated, &toDoList)) == NULL) return NULL; while (!toDoList.empty()) { // Property iterator will also iterate Array object indexes (they are converted into string). XBOX::VJSValue value(inValue.GetContext(), toDoList.front().fValueRef); XBOX::VJSPropertyIterator i(value.GetObject()); SNode *p, *q, *r; p = toDoList.front().fNode; xbox_assert(p->fType == eNODE_OBJECT || p->fType == eNODE_ARRAY); toDoList.pop_front(); // Object or Array with no attributes? if (!i.IsValid()) continue; // Get prototype and dump its attribute names. XBOX::VJSObject prototypeObject = value.GetObject().GetPrototype(inValue.GetContext()); bool hasPrototype = prototypeObject.IsObject(); // Iterate child(s). for ( ; i.IsValid(); ++i) { XBOX::VString name; i.GetPropertyName(name); // Check attribute name: If it is part of prototype, do not clone it. if (hasPrototype && prototypeObject.HasProperty(name)) continue; value = i.GetProperty(); if ((r = _ValueToNode(value, &alreadyCreated, &toDoList)) == NULL) break; else if (p->fValue.fFirstChild != NULL) q->fNextSibling = r; else p->fValue.fFirstChild = r; r->fName = name; q = r; } if (p->fValue.fFirstChild != NULL) q->fNextSibling = NULL; if (i.IsValid()) { _FreeNode(root); root = NULL; break; } } if (root != NULL) { VJSStructuredClone *structuredClone; if ((structuredClone = new VJSStructuredClone()) != NULL) structuredClone->fRoot = root; else _FreeNode(root); return structuredClone; } else return NULL; }
MediaWindow::SmartNode::~SmartNode() { _FreeNode(); }
USING_TOOLBOX_NAMESPACE VJSStructuredClone *VJSStructuredClone::RetainClone (XBOX::VJSValue inValue) { std::map<JS4D::ValueRef, SNode *> alreadyCreated; std::list<SEntry> toDoList; SNode *root; if ((root = _ValueToNode(inValue, &alreadyCreated, &toDoList)) == NULL) return NULL; while (!toDoList.empty()) { // Property iterator will also iterate Array object indexes (they are converted into string). XBOX::VJSValue value(inValue.GetContext(), toDoList.front().fValueRef); XBOX::VJSPropertyIterator i(value.GetObject()); SNode *p, *q; p = toDoList.front().fNode; xbox_assert(p->fType == eNODE_OBJECT || p->fType == eNODE_ARRAY); toDoList.pop_front(); // Object or Array with no attributes? if (!i.IsValid()) continue; // Set first child. value = i.GetProperty(); if ((p->fValue.fFirstChild = _ValueToNode(value, &alreadyCreated, &toDoList)) == NULL) { _FreeNode(root); root = NULL; break; } q = p->fValue.fFirstChild; i.GetPropertyName(q->fName); ++i; // Iterate sibling(s). for ( ; i.IsValid(); ++i) { value = i.GetProperty(); if ((p = _ValueToNode(value, &alreadyCreated, &toDoList)) == NULL) break; else { q = q->fNextSibling = p; i.GetPropertyName(p->fName); } } q->fNextSibling = NULL; if (i.IsValid()) { _FreeNode(root); root = NULL; break; } } if (root != NULL) { VJSStructuredClone *structuredClone; if ((structuredClone = new VJSStructuredClone()) != NULL) structuredClone->fRoot = root; else _FreeNode(root); return structuredClone; } else return NULL; }