bool SharedMenuBuffer::InsertMenu(UINT id, LPCTSTR text, BOOL check) { //Create a view of the file if none yet if (m_hViewPtr == NULL) { m_hViewPtr = MapViewOfFile(m_hFileMapping, FILE_MAP_WRITE, 0, 0, 0); m_pBuffer = (char*)m_hViewPtr; } if (m_hViewPtr == NULL) return false; //TODO: Check if there is enough space in buffer //Insert the data in the buffer ItemType(m_pBuffer) = (char)(check ? MENUITEM_CHECKED : MENUITEM_UNCHECKED); ItemId(m_pBuffer) = id; _tcscpy(ItemName(m_pBuffer), text ? text : TEXT("")); //Move the insertion pointer m_pBuffer += ItemLength(m_pBuffer); ItemType(m_pBuffer) = MENUITEM_NONE; return true; }
bool SharedMenuBuffer::ReadMenu(HMENU hMenu, UINT (*filter)(UINT)) { LPVOID viewPtr = MapViewOfFile(m_hFileMapping, FILE_MAP_READ, 0, 0, 0); char * buffer = (char*)viewPtr; bool result = true; if (viewPtr == NULL) return false; //Build the menu from the data in the buffer while(ItemType(buffer) != MENUITEM_NONE) { MENUITEMINFO menuitem; menuitem.cbSize = sizeof(MENUITEMINFO); menuitem.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STATE | MIIM_STRING; menuitem.fType = (ItemId(buffer) == 0) ? MFT_SEPARATOR : MFT_STRING; menuitem.wID = filter(ItemId(buffer)); menuitem.fState = (ItemType(buffer) == MENUITEM_CHECKED) ? MFS_CHECKED : MFS_UNCHECKED; menuitem.dwTypeData = ItemName(buffer); if (!InsertMenuItem(hMenu, (UINT)-1, TRUE, &menuitem)) { result = false; break; } buffer += ItemLength(buffer); } UnmapViewOfFile(viewPtr); return result; }
void heapQdriver::RunTests() { std::cout << "Testing Minimum Heap Implementation" << std::endl; int enq = 0; int deq = 0; //create heap version of priorityQ heapQ minHeapQ = heapQ(100); //for loop that creat 50 items using random int and adds them to the heapQ for (int i = 0; i < 50; i++) { ItemType item = ItemType(rand()); //item.Print(); enq += minHeapQ.Enqueue(item); } //print out accessed number for enqueing std::cout << std::endl << "heapQ moves to Enqueue 50 items: " << enq << std::endl; std::cout << "List length: " << minHeapQ.GetLength(); //for loop the pops 50 items of the heapQ for (int i = 0; i < minHeapQ.GetLength(); i++) { ItemType temp; deq += minHeapQ.Dequeue(temp); } //print out accessed number for dequeueing std::cout << std::endl << "heapQ moves to Dequeue 50 items: " << deq << std::endl; }
QVariant SceneTreeItem::data(int role) const { QVariant v; switch(role) { case Qt::DecorationRole: v = ItemIcon(); break; case Qt::DisplayRole: v = ItemName(); break; case EIDR_Type: v = ItemType(); break; case EIDR_Data: v = ItemData(); break; case Qt::BackgroundColorRole: v = ItemBackgroundColor(); break; default: break; } if(v.isNull()) { v = QStandardItem::data(role); } return v; }
//Insert limit elements of the file fin into heap. void insertNext(PQ & pq, ifstream & fin, int limit = 0) { if (limit == 0) limit = numeric_limits<int>::max(); string word; int ct; while (!fin.eof() && pq.size < limit){ fin >> word >> ct; pq.insert(ItemType(word, ct)); } }
void Peers::add_station(QString info) { QStringList lines = info.split(QRegExp("\\n")); QString name; for (QStringList::Iterator it = lines.begin(); it != lines.end(); it++) { int pos = (*it).indexOf('=') + 1; if (pos < 1) continue; if ((*it).startsWith("wpsDeviceName=")) name = (*it).mid(pos); else if ((*it).startsWith("p2p_device_name=")) name = (*it).mid(pos); } if (name.isEmpty()) name = lines[0]; QStandardItem *item = new QStandardItem(*laptop_icon, name); if (item) { /* Remove WPS enrollee entry if one is still pending */ if (model.rowCount() > 0) { QModelIndexList lst = model.match(model.index(0, 0), peer_role_address, lines[0]); for (int i = 0; i < lst.size(); i++) { QStandardItem *item; item = model.itemFromIndex(lst[i]); if (item == NULL) continue; int type = item->data(peer_role_type).toInt(); if (type == PEER_TYPE_WPS_ENROLLEE) { model.removeRow(lst[i].row()); break; } } } item->setData(lines[0], peer_role_address); item->setData(PEER_TYPE_ASSOCIATED_STATION, peer_role_type); item->setData(info, peer_role_details); item->setToolTip(ItemType(PEER_TYPE_ASSOCIATED_STATION)); model.appendRow(item); } }
bool ItemDatabase::loadMetaItem(pugi::xml_node node) { if(pugi::xml_attribute attribute = node.attribute("id")) { int32_t id = pugi::cast<int32_t>(attribute.value()); if(items[id]) { //std::cout << "Occupied ID " << id << " : " << items[id]->id << ":" << items[id]->name << std::endl; return false; } items.set(id, newd ItemType()); items[id]->is_metaitem = true; items[id]->id = id; } else { return false; } return true; }
void Peers::add_p2p_group_client(QStandardItem * /*parent*/, QString params) { /* * dev=02:b5:64:63:30:63 iface=02:b5:64:63:30:63 dev_capab=0x0 * dev_type=1-0050f204-1 dev_name='Wireless Client' * config_methods=0x8c */ QStringList items = params.split(QRegExp(" (?=[^']*('[^']*'[^']*)*$)")); QString addr = ""; QString name = ""; int config_methods = 0; QString dev_type; for (int i = 0; i < items.size(); i++) { QString str = items.at(i); int pos = str.indexOf('=') + 1; if (str.startsWith("dev_name='")) name = str.section('\'', 1, -2); else if (str.startsWith("config_methods=")) config_methods = str.section('=', 1).toInt(0, 0); else if (str.startsWith("dev=")) addr = str.mid(pos); else if (str.startsWith("dev_type=") && dev_type.isEmpty()) dev_type = str.mid(pos); } QStandardItem *item = find_addr(addr); if (item) return; item = new QStandardItem(*default_icon, name); if (item) { /* TODO: indicate somehow the relationship to the group owner * (parent) */ item->setData(addr, peer_role_address); item->setData(config_methods, peer_role_config_methods); item->setData(PEER_TYPE_P2P_CLIENT, peer_role_type); if (!dev_type.isEmpty()) item->setData(dev_type, peer_role_pri_dev_type); item->setData(items.join(QString("\n")), peer_role_details); item->setToolTip(ItemType(PEER_TYPE_P2P_CLIENT)); model.appendRow(item); } }
static item_type ItemTypeFromMADType( mad_type_handle mth ) { mad_type_info mti; MADTypeInfo( mth, &mti ); switch( mti.b.kind ) { case MTK_INTEGER: case MTK_MMX: case MTK_XMM: case MTK_CUSTOM: return( ItemType( BITS2BYTES( mti.b.bits ) ) ); case MTK_ADDRESS: switch( mti.b.bits ) { case 16: return( IT_SO ); case 32: if( mti.a.seg.bits == 0 ) { return( IT_LO ); } else { return( IT_SA ); } case 48: return( IT_LA ); } break; case MTK_FLOAT: switch( mti.b.bits ) { case 32: return( IT_SF ); case 64: return( IT_LF ); case 80: return( IT_XF ); } break; } return( IT_NIL ); }
void Peers::add_persistent(int id, const char *ssid, const char *bssid) { char cmd[100]; char reply[100]; size_t reply_len; int mode; snprintf(cmd, sizeof(cmd), "GET_NETWORK %d mode", id); if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) return; reply[reply_len] = '\0'; mode = atoi(reply); QString name = ssid; name = '[' + name + ']'; QStandardItem *item = new QStandardItem(*group_icon, name); if (!item) return; int type; if (mode == 3) type = PEER_TYPE_P2P_PERSISTENT_GROUP_GO; else type = PEER_TYPE_P2P_PERSISTENT_GROUP_CLIENT; item->setData(type, peer_role_type); item->setToolTip(ItemType(type)); item->setData(ssid, peer_role_ssid); if (bssid && strcmp(bssid, "any") == 0) bssid = NULL; if (bssid) item->setData(bssid, peer_role_address); item->setData(id, peer_role_network_id); item->setBackground(Qt::BDiagPattern); model.appendRow(item); }
// Delete maximum value, re-heapify, and return max element ItemType PQHeap::deleteMax( ) { if (size==0) return ItemType("error", -1); ItemType toReturn = heap[0]; size--; ItemType currVal = heap[size]; int curr = 0; int left = 1; int right = left+1; bool keepGoing; do{ //while( ( left < size && currVal.priority < heap[left].priority) || // ( right < size && currVal.priority < heap[right].priority ) ){ int bestChild = left; bestChild = getBestKid(left, right, size); right = bestChild; heap[curr] = heap[bestChild]; curr = bestChild; left = KIDS*bestChild+1; right = left+1; keepGoing = false; for(int j = 0; j< KIDS; j++) { if(left + j < size && currVal.priority < heap[left+j].priority) keepGoing = true; } }while(keepGoing); // endwhile heap[curr] = currVal; return toReturn; }
HEESGraphicsItem::HEESGraphicsItem(int t) { leftArrow = NULL; rightArrow = NULL; portAItem = NULL; portBItem = NULL; qreal xPos = 0; qreal yPos = 0; type = ItemType(t); type = ItemType(t); QPainterPath path; QPolygonF myPolygon; switch (type) { case SOURCE: path.moveTo(xPos, yPos); path.arcTo(xPos - 50, yPos - 25, 50, 50, 0, 360); myPolygon = path.toFillPolygon(); break; case BANK: path.moveTo(xPos, yPos); path.arcTo(xPos - 39, yPos - 10, 40, 20, 0, 360); path.lineTo(xPos, yPos + 40); path.arcTo(xPos - 39, yPos + 40, 40, 20, 0, -180); path.lineTo(xPos - 39, yPos); path.arcTo(xPos - 39, yPos - 10, 40, 20, 180, 180); myPolygon = path.toFillPolygon(); break; case LOAD: path.moveTo(xPos, yPos); path.lineTo(xPos, yPos + 50); path.lineTo(xPos - 36, yPos + 50); path.lineTo(xPos - 36, yPos); myPolygon = path.toFillPolygon(); break; case CTI: path.moveTo(xPos, yPos); path.lineTo(xPos + 20, yPos + 20); path.lineTo(xPos + 10, yPos + 20); path.lineTo(xPos + 10, yPos + 120); path.lineTo(xPos + 20, yPos + 120); path.lineTo(xPos, yPos + 140); path.lineTo(xPos - 20, yPos + 120); path.lineTo(xPos - 10, yPos + 120); path.lineTo(xPos - 10, yPos + 20); path.lineTo(xPos - 20, yPos + 20); myPolygon = path.toFillPolygon(); break; case CONVERTER: leftArrow = new ArrowItem(true, this); rightArrow = new ArrowItem(false, this); path.moveTo(xPos, yPos); path.lineTo(xPos + 5, yPos + 5); path.lineTo(xPos + 5, yPos + 25); path.lineTo(xPos, yPos + 30); path.lineTo(xPos - 30, yPos + 30); path.lineTo(xPos - 35, yPos + 25); path.lineTo(xPos - 35, yPos + 5); path.lineTo(xPos - 30, yPos); myPolygon = path.toFillPolygon(); break; } QBrush brush(QColor(255,255,255)); setBrush(brush); setPolygon(myPolygon); setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); setPos(qrand() % 200 - 100, qrand() % 200 - 100); // Make other components stay on top of the converter and arrows if( type != CONVERTER) setZValue(1); willBeRemoved = false; }
ITEM_TYPE ItemProperty::GetType() const { return ItemType(Types[3],Types[4],Types[5]); }
bool ItemDatabase::loadFromOtbVer3(BinaryNode* itemNode, wxString& error, wxArrayString& warnings) { uint8_t u8; for( ; itemNode != nullptr; itemNode = itemNode->advance()) { if(!itemNode->getU8(u8)) { // Invalid! warnings.push_back(wxT("Invalid item type encountered...")); continue; } if(ItemGroup_t(u8) == ITEM_GROUP_DEPRECATED) continue; ItemType* t = newd ItemType(); t->group = ItemGroup_t(u8); switch(t->group) { case ITEM_GROUP_NONE: case ITEM_GROUP_GROUND: case ITEM_GROUP_SPLASH: case ITEM_GROUP_FLUID: break; case ITEM_GROUP_CONTAINER: t->type = ITEM_TYPE_CONTAINER; break; break; default: warnings.push_back(wxT("Unknown item group declaration")); } uint32_t flags; if(itemNode->getU32(flags)) { t->blockSolid = ((flags & FLAG_BLOCK_SOLID) == FLAG_BLOCK_SOLID); t->blockProjectile = ((flags & FLAG_BLOCK_PROJECTILE) == FLAG_BLOCK_PROJECTILE); t->blockPathFind = ((flags & FLAG_BLOCK_PATHFIND) == FLAG_BLOCK_PATHFIND); t->pickupable = ((flags & FLAG_PICKUPABLE) == FLAG_PICKUPABLE); t->moveable = ((flags & FLAG_MOVEABLE) == FLAG_MOVEABLE); t->stackable = ((flags & FLAG_STACKABLE) == FLAG_STACKABLE); t->floorChangeDown = ((flags & FLAG_FLOORCHANGEDOWN) == FLAG_FLOORCHANGEDOWN); t->floorChangeNorth = ((flags & FLAG_FLOORCHANGENORTH) == FLAG_FLOORCHANGENORTH); t->floorChangeEast = ((flags & FLAG_FLOORCHANGEEAST) == FLAG_FLOORCHANGEEAST); t->floorChangeSouth = ((flags & FLAG_FLOORCHANGESOUTH) == FLAG_FLOORCHANGESOUTH); t->floorChangeWest = ((flags & FLAG_FLOORCHANGEWEST) == FLAG_FLOORCHANGEWEST); // Now this is confusing, just accept that the ALWAYSONTOP flag means it's always on bottom, got it?! t->alwaysOnBottom = ((flags & FLAG_ALWAYSONTOP) == FLAG_ALWAYSONTOP); t->isVertical = ((flags & FLAG_VERTICAL) == FLAG_VERTICAL); t->isHorizontal = ((flags & FLAG_HORIZONTAL) == FLAG_HORIZONTAL); t->isHangable = ((flags & FLAG_HANGABLE) == FLAG_HANGABLE); t->allowDistRead = ((flags & FLAG_ALLOWDISTREAD) == FLAG_ALLOWDISTREAD); t->rotable = ((flags & FLAG_ROTABLE) == FLAG_ROTABLE); t->canReadText = ((flags & FLAG_READABLE) == FLAG_READABLE); t->client_chargeable = ((flags & FLAG_CLIENTCHARGES) == FLAG_CLIENTCHARGES); } uint8_t attribute; while(itemNode->getU8(attribute)) { uint16_t datalen; if(!itemNode->getU16(datalen)) { warnings.push_back(wxT("Invalid item type property")); break; } switch(attribute) { case ITEM_ATTR_SERVERID: { if(datalen != sizeof(uint16_t)) { error = wxT("items.otb: Unexpected data length of server id block (Should be 2 bytes)"); return false; } if(!itemNode->getU16(t->id)) warnings.push_back(wxT("Invalid item type property (2)")); if(max_item_id < t->id) max_item_id = t->id; break; } case ITEM_ATTR_CLIENTID: { if(datalen != sizeof(uint16_t)) { error = wxT("items.otb: Unexpected data length of client id block (Should be 2 bytes)"); return false; } if(!itemNode->getU16(t->clientID)) warnings.push_back(wxT("Invalid item type property (2)")); t->sprite = static_cast<GameSprite*>(gui.gfx.getSprite(t->clientID)); break; } case ITEM_ATTR_SPEED: { if(datalen != sizeof(uint16_t)) { error = wxT("items.otb: Unexpected data length of speed block (Should be 2 bytes)"); return false; } //t->speed = itemNode->getU16(); if(!itemNode->skip(2)) // Just skip two bytes, we don't need speed warnings.push_back(wxT("Invalid item type property (3)")); break; } case ITEM_ATTR_LIGHT2: { if(datalen != sizeof(lightBlock2)) { warnings.push_back(wxT("items.otb: Unexpected data length of item light (2) block (Should be ") + i2ws(sizeof(lightBlock2)) + wxT(" bytes)")); break; } if(!itemNode->skip(4)) // Just skip two bytes, we don't need light warnings.push_back(wxT("Invalid item type property (4)")); //t->lightLevel = itemNode->getU16(); //t->lightColor = itemNode->getU16(); break; } case ITEM_ATTR_TOPORDER: { if(datalen != sizeof(uint8_t)) { warnings.push_back(wxT("items.otb: Unexpected data length of item toporder block (Should be 1 byte)")); break; } if(!itemNode->getU8(u8)) warnings.push_back(wxT("Invalid item type property (5)")); t->alwaysOnTopOrder = u8; break; } default: { //skip unknown attributes itemNode->skip(datalen); //warnings.push_back(wxT("items.otb: Skipped unknown attribute")); break; } } } if(t) { if(items[t->id]) { warnings.push_back(wxT("items.otb: Duplicate items")); delete items[t->id]; } items.set(t->id, t); } } return true; }
bool ItemDatabase::loadFromOtbVer1(BinaryNode* itemNode, wxString& error, wxArrayString& warnings) { uint8_t u8; for( ; itemNode != nullptr; itemNode = itemNode->advance()) { if(!itemNode->getU8(u8)) { // Invalid! warnings.push_back(wxT("Invalid item type encountered...")); continue; } if(u8 == ITEM_GROUP_DEPRECATED) continue; ItemType* t = newd ItemType(); t->group = ItemGroup_t(u8); switch(t->group) { case ITEM_GROUP_NONE: case ITEM_GROUP_GROUND: case ITEM_GROUP_SPLASH: case ITEM_GROUP_FLUID: case ITEM_GROUP_WEAPON: case ITEM_GROUP_AMMUNITION: case ITEM_GROUP_ARMOR: case ITEM_GROUP_WRITEABLE: case ITEM_GROUP_KEY: break; case ITEM_GROUP_DOOR: t->type = ITEM_TYPE_DOOR; break; case ITEM_GROUP_CONTAINER: t->type = ITEM_TYPE_CONTAINER; break; case ITEM_GROUP_RUNE: t->client_chargeable = true; break; case ITEM_GROUP_TELEPORT: t->type = ITEM_TYPE_TELEPORT; break; case ITEM_GROUP_MAGICFIELD: t->type = ITEM_TYPE_MAGICFIELD; break; default: warnings.push_back(wxT("Unknown item group declaration")); } uint32_t flags; if(itemNode->getU32(flags)) { t->blockSolid = ((flags & FLAG_BLOCK_SOLID) == FLAG_BLOCK_SOLID); t->blockProjectile = ((flags & FLAG_BLOCK_PROJECTILE) == FLAG_BLOCK_PROJECTILE); t->blockPathFind = ((flags & FLAG_BLOCK_PATHFIND) == FLAG_BLOCK_PATHFIND); // These are irrelevant //t->hasHeight = ((flags & FLAG_HAS_HEIGHT) == FLAG_HAS_HEIGHT); //t->useable = ((flags & FLAG_USEABLE) == FLAG_USEABLE); t->pickupable = ((flags & FLAG_PICKUPABLE) == FLAG_PICKUPABLE); t->moveable = ((flags & FLAG_MOVEABLE) == FLAG_MOVEABLE); t->stackable = ((flags & FLAG_STACKABLE) == FLAG_STACKABLE); t->floorChangeDown = ((flags & FLAG_FLOORCHANGEDOWN) == FLAG_FLOORCHANGEDOWN); t->floorChangeNorth = ((flags & FLAG_FLOORCHANGENORTH) == FLAG_FLOORCHANGENORTH); t->floorChangeEast = ((flags & FLAG_FLOORCHANGEEAST) == FLAG_FLOORCHANGEEAST); t->floorChangeSouth = ((flags & FLAG_FLOORCHANGESOUTH) == FLAG_FLOORCHANGESOUTH); t->floorChangeWest = ((flags & FLAG_FLOORCHANGEWEST) == FLAG_FLOORCHANGEWEST); // Now this is confusing, just accept that the ALWAYSONTOP flag means it's always on bottom, got it?! t->alwaysOnBottom = ((flags & FLAG_ALWAYSONTOP) == FLAG_ALWAYSONTOP); t->isVertical = ((flags & FLAG_VERTICAL) == FLAG_VERTICAL); t->isHorizontal = ((flags & FLAG_HORIZONTAL) == FLAG_HORIZONTAL); t->isHangable = ((flags & FLAG_HANGABLE) == FLAG_HANGABLE); t->allowDistRead = ((flags & FLAG_ALLOWDISTREAD) == FLAG_ALLOWDISTREAD); t->rotable = ((flags & FLAG_ROTABLE) == FLAG_ROTABLE); t->canReadText = ((flags & FLAG_READABLE) == FLAG_READABLE); } uint8_t attribute; while(itemNode->getU8(attribute)) { uint16_t datalen; if(!itemNode->getU16(datalen)) { warnings.push_back(wxT("Invalid item type property")); break; } switch(attribute) { case ITEM_ATTR_SERVERID: { if(datalen != sizeof(uint16_t)) { error = wxT("items.otb: Unexpected data length of server id block (Should be 2 bytes)"); return false; } if(!itemNode->getU16(t->id)) warnings.push_back(wxT("Invalid item type property (2)")); if(max_item_id < t->id) max_item_id = t->id; break; } case ITEM_ATTR_CLIENTID: { if(datalen != sizeof(uint16_t)) { error = wxT("items.otb: Unexpected data length of client id block (Should be 2 bytes)"); return false; } if(!itemNode->getU16(t->clientID)) warnings.push_back(wxT("Invalid item type property (2)")); t->sprite = static_cast<GameSprite*>(gui.gfx.getSprite(t->clientID)); break; } case ITEM_ATTR_SPEED: { if(datalen != sizeof(uint16_t)) { error = wxT("items.otb: Unexpected data length of speed block (Should be 2 bytes)"); return false; } //t->speed = itemNode->getU16(); if(!itemNode->skip(2)) // Just skip two bytes, we don't need speed warnings.push_back(wxT("Invalid item type property (3)")); break; } case ITEM_ATTR_LIGHT2: { if(datalen != sizeof(lightBlock2)) { warnings.push_back(wxT("items.otb: Unexpected data length of item light (2) block (Should be ") + i2ws(sizeof(lightBlock2)) + wxT(" bytes)")); break; } if(!itemNode->skip(4)) // Just skip two bytes, we don't need light warnings.push_back(wxT("Invalid item type property (4)")); //t->lightLevel = itemNode->getU16(); //t->lightColor = itemNode->getU16(); break; } case ITEM_ATTR_TOPORDER: { if(datalen != sizeof(uint8_t)) { warnings.push_back(wxT("items.otb: Unexpected data length of item toporder block (Should be 1 byte)")); break; } uint8_t u8 = 0; if(!itemNode->getU8(u8)) warnings.push_back(wxT("Invalid item type property (5)")); t->alwaysOnTopOrder = u8; break; } case ITEM_ATTR_NAME: { if(datalen >= 128) { warnings.push_back(wxT("items.otb: Unexpected data length of item name block (Should be 128 bytes)")); break; } uint8_t name[128]; memset(&name, 0, 128); if(!itemNode->getRAW(name, datalen)) { warnings.push_back(wxT("Invalid item type property (6)")); break; } t->name = (char*)name; break; } case ITEM_ATTR_DESCR: { if(datalen >= 128) { warnings.push_back(wxT("items.otb: Unexpected data length of item descr block (Should be 128 bytes)")); break; } uint8_t description[128]; memset(&description, 0, 128); if(!itemNode->getRAW(description, datalen)) { warnings.push_back(wxT("Invalid item type property (7)")); break; } t->description = (char*)description; break; } case ITEM_ATTR_MAXITEMS: { if(datalen != sizeof(unsigned short)) { warnings.push_back(wxT("items.otb: Unexpected data length of item volume block (Should be 2 bytes)")); break; } if(!itemNode->getU16(t->volume)) warnings.push_back(wxT("Invalid item type property (8)")); break; } case ITEM_ATTR_WEIGHT: { if(datalen != sizeof(double)) { warnings.push_back(wxT("items.otb: Unexpected data length of item weight block (Should be 8 bytes)")); break; } uint8_t w[sizeof(double)]; if(!itemNode->getRAW(w, sizeof(double))) { warnings.push_back(wxT("Invalid item type property (7)")); break; } double wi = *reinterpret_cast<double*>(&w); t->weight = wi; break; } case ITEM_ATTR_ROTATETO: { if(datalen != sizeof(unsigned short)) { warnings.push_back(wxT("items.otb: Unexpected data length of item rotateTo block (Should be 2 bytes)")); break; } uint16_t rotate; if(!itemNode->getU16(rotate)) { warnings.push_back(wxT("Invalid item type property (8)")); break; } t->rotateTo = rotate; break; } case ITEM_ATTR_WRITEABLE3: { if(datalen != sizeof(writeableBlock3)) { warnings.push_back(wxT("items.otb: Unexpected data length of item toporder block (Should be 1 byte)")); break; } uint16_t readOnlyID; uint16_t maxTextLen; if(!itemNode->getU16(readOnlyID)) { warnings.push_back(wxT("Invalid item type property (9)")); break; } if(!itemNode->getU16(maxTextLen)) { warnings.push_back(wxT("Invalid item type property (10)")); break; } //t->readOnlyId = wb3->readOnlyId; t->maxTextLen = maxTextLen; break; } default: { //skip unknown attributes itemNode->skip(datalen); //warnings.push_back(wxT("items.otb: Skipped unknown attribute")); break; } } } if(t) { if(items[t->id]) { warnings.push_back(wxT("items.otb: Duplicate items")); delete items[t->id]; } items.set(t->id, t); } } return true; }
void Peers::event_notify(WpaMsg msg) { QString text = msg.getMsg(); if (text.startsWith(WPS_EVENT_PIN_NEEDED)) { /* * WPS-PIN-NEEDED 5a02a5fa-9199-5e7c-bc46-e183d3cb32f7 * 02:2a:c4:18:5b:f3 * [Wireless Client|Company|cmodel|123|12345|1-0050F204-1] */ QStringList items = text.split(' '); QString uuid = items[1]; QString addr = items[2]; QString name = ""; QStandardItem *item = find_addr(addr); if (item) return; int pos = text.indexOf('['); if (pos >= 0) { int pos2 = text.lastIndexOf(']'); if (pos2 >= pos) { items = text.mid(pos + 1, pos2 - pos - 1). split('|'); name = items[0]; items.append(addr); } } item = new QStandardItem(*laptop_icon, name); if (item) { item->setData(addr, peer_role_address); item->setData(PEER_TYPE_WPS_PIN_NEEDED, peer_role_type); item->setToolTip(ItemType(PEER_TYPE_WPS_PIN_NEEDED)); item->setData(items.join("\n"), peer_role_details); item->setData(items[5], peer_role_pri_dev_type); model.appendRow(item); } return; } if (text.startsWith(AP_STA_CONNECTED)) { /* AP-STA-CONNECTED 02:2a:c4:18:5b:f3 */ QStringList items = text.split(' '); QString addr = items[1]; QStandardItem *item = find_addr(addr); if (item == NULL || item->data(peer_role_type).toInt() != PEER_TYPE_ASSOCIATED_STATION) add_single_station(addr.toAscii().constData()); return; } if (text.startsWith(AP_STA_DISCONNECTED)) { /* AP-STA-DISCONNECTED 02:2a:c4:18:5b:f3 */ QStringList items = text.split(' '); QString addr = items[1]; if (model.rowCount() == 0) return; QModelIndexList lst = model.match(model.index(0, 0), peer_role_address, addr, -1); for (int i = 0; i < lst.size(); i++) { QStandardItem *item = model.itemFromIndex(lst[i]); if (item && item->data(peer_role_type).toInt() == PEER_TYPE_ASSOCIATED_STATION) { model.removeRow(lst[i].row()); break; } } return; } if (text.startsWith(P2P_EVENT_DEVICE_FOUND)) { /* * P2P-DEVICE-FOUND 02:b5:64:63:30:63 * p2p_dev_addr=02:b5:64:63:30:63 pri_dev_type=1-0050f204-1 * name='Wireless Client' config_methods=0x84 dev_capab=0x21 * group_capab=0x0 */ QStringList items = text.split(QRegExp(" (?=[^']*('[^']*'[^']*)*$)")); QString addr = items[1]; QString name = ""; QString pri_dev_type; int config_methods = 0; for (int i = 0; i < items.size(); i++) { QString str = items.at(i); if (str.startsWith("name='")) name = str.section('\'', 1, -2); else if (str.startsWith("config_methods=")) config_methods = str.section('=', 1).toInt(0, 0); else if (str.startsWith("pri_dev_type=")) pri_dev_type = str.section('=', 1); } QStandardItem *item = find_addr(addr); if (item) { int type = item->data(peer_role_type).toInt(); if (type == PEER_TYPE_P2P) return; } item = new QStandardItem(*default_icon, name); if (item) { item->setData(addr, peer_role_address); item->setData(config_methods, peer_role_config_methods); item->setData(PEER_TYPE_P2P, peer_role_type); if (!pri_dev_type.isEmpty()) item->setData(pri_dev_type, peer_role_pri_dev_type); item->setData(items.join(QString("\n")), peer_role_details); item->setToolTip(ItemType(PEER_TYPE_P2P)); model.appendRow(item); } item = find_addr_type(addr, PEER_TYPE_P2P_PERSISTENT_GROUP_CLIENT); if (item) item->setBackground(Qt::NoBrush); } if (text.startsWith(P2P_EVENT_GROUP_STARTED)) { /* P2P-GROUP-STARTED wlan0-p2p-0 GO ssid="DIRECT-3F" * passphrase="YOyTkxID" go_dev_addr=02:40:61:c2:f3:b7 * [PERSISTENT] */ QStringList items = text.split(' '); if (items.size() < 4) return; int pos = text.indexOf(" ssid=\""); if (pos < 0) return; QString ssid = text.mid(pos + 7); pos = ssid.indexOf(" passphrase=\""); if (pos < 0) pos = ssid.indexOf(" psk="); if (pos >= 0) ssid.truncate(pos); pos = ssid.lastIndexOf('"'); if (pos >= 0) ssid.truncate(pos); QStandardItem *item = new QStandardItem(*group_icon, ssid); if (item) { item->setData(PEER_TYPE_P2P_GROUP, peer_role_type); item->setData(items[1], peer_role_ifname); QString details; if (items[2] == "GO") { details = tr("P2P GO for interface ") + items[1]; } else { details = tr("P2P client for interface ") + items[1]; } if (text.contains(" [PERSISTENT]")) details += "\nPersistent group"; item->setData(details, peer_role_details); item->setToolTip(ItemType(PEER_TYPE_P2P_GROUP)); model.appendRow(item); } } if (text.startsWith(P2P_EVENT_GROUP_REMOVED)) { /* P2P-GROUP-REMOVED wlan0-p2p-0 GO */ QStringList items = text.split(' '); if (items.size() < 2) return; if (model.rowCount() == 0) return; QModelIndexList lst = model.match(model.index(0, 0), peer_role_ifname, items[1]); for (int i = 0; i < lst.size(); i++) model.removeRow(lst[i].row()); return; } if (text.startsWith(P2P_EVENT_PROV_DISC_SHOW_PIN)) { /* P2P-PROV-DISC-SHOW-PIN 02:40:61:c2:f3:b7 12345670 */ QStringList items = text.split(' '); if (items.size() < 3) return; QString addr = items[1]; QString pin = items[2]; QStandardItem *item = find_addr_type(addr, PEER_TYPE_P2P); if (item == NULL) return; item->setData(SEL_METHOD_PIN_LOCAL_DISPLAY, peer_role_selected_method); item->setData(pin, peer_role_selected_pin); QVariant var = item->data(peer_role_requested_method); if (var.isValid() && var.toInt() == SEL_METHOD_PIN_LOCAL_DISPLAY) { ctx_item = item; ctx_p2p_display_pin_pd(); } return; } if (text.startsWith(P2P_EVENT_PROV_DISC_ENTER_PIN)) { /* P2P-PROV-DISC-ENTER-PIN 02:40:61:c2:f3:b7 */ QStringList items = text.split(' '); if (items.size() < 2) return; QString addr = items[1]; QStandardItem *item = find_addr_type(addr, PEER_TYPE_P2P); if (item == NULL) return; item->setData(SEL_METHOD_PIN_PEER_DISPLAY, peer_role_selected_method); QVariant var = item->data(peer_role_requested_method); if (var.isValid() && var.toInt() == SEL_METHOD_PIN_PEER_DISPLAY) { ctx_item = item; ctx_p2p_connect(); } return; } if (text.startsWith(P2P_EVENT_INVITATION_RECEIVED)) { /* P2P-INVITATION-RECEIVED sa=02:f0:bc:44:87:62 persistent=4 */ QStringList items = text.split(' '); if (items.size() < 3) return; if (!items[1].startsWith("sa=") || !items[2].startsWith("persistent=")) return; QString addr = items[1].mid(3); int id = items[2].mid(11).toInt(); char cmd[100]; char reply[100]; size_t reply_len; snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ssid", id); reply_len = sizeof(reply) - 1; if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) return; reply[reply_len] = '\0'; QString name; char *pos = strrchr(reply, '"'); if (pos && reply[0] == '"') { *pos = '\0'; name = reply + 1; } else name = reply; QStandardItem *item; item = find_addr_type(addr, PEER_TYPE_P2P_INVITATION); if (item) model.removeRow(item->row()); item = new QStandardItem(*invitation_icon, name); if (!item) return; item->setData(PEER_TYPE_P2P_INVITATION, peer_role_type); item->setToolTip(ItemType(PEER_TYPE_P2P_INVITATION)); item->setData(addr, peer_role_address); item->setData(id, peer_role_network_id); model.appendRow(item); enable_persistent(id); return; } if (text.startsWith(P2P_EVENT_INVITATION_RESULT)) { /* P2P-INVITATION-RESULT status=1 */ /* TODO */ return; } if (text.startsWith(WPS_EVENT_ER_AP_ADD)) { /* * WPS-ER-AP-ADD 87654321-9abc-def0-1234-56789abc0002 * 02:11:22:33:44:55 pri_dev_type=6-0050F204-1 wps_state=1 * |Very friendly name|Company|Long description of the model| * WAP|http://w1.fi/|http://w1.fi/hostapd/ */ QStringList items = text.split(' '); if (items.size() < 5) return; QString uuid = items[1]; QString addr = items[2]; QString pri_dev_type = items[3].mid(13); int wps_state = items[4].mid(10).toInt(); int pos = text.indexOf('|'); if (pos < 0) return; items = text.mid(pos + 1).split('|'); if (items.size() < 1) return; QStandardItem *item = find_uuid(uuid); if (item) return; item = new QStandardItem(*ap_icon, items[0]); if (item) { item->setData(uuid, peer_role_uuid); item->setData(addr, peer_role_address); int type = wps_state == 2 ? PEER_TYPE_WPS_ER_AP: PEER_TYPE_WPS_ER_AP_UNCONFIGURED; item->setData(type, peer_role_type); item->setToolTip(ItemType(type)); item->setData(pri_dev_type, peer_role_pri_dev_type); item->setData(items.join(QString("\n")), peer_role_details); model.appendRow(item); } return; } if (text.startsWith(WPS_EVENT_ER_AP_REMOVE)) { /* WPS-ER-AP-REMOVE 87654321-9abc-def0-1234-56789abc0002 */ QStringList items = text.split(' '); if (items.size() < 2) return; if (model.rowCount() == 0) return; QModelIndexList lst = model.match(model.index(0, 0), peer_role_uuid, items[1]); for (int i = 0; i < lst.size(); i++) { QStandardItem *item = model.itemFromIndex(lst[i]); if (item && (item->data(peer_role_type).toInt() == PEER_TYPE_WPS_ER_AP || item->data(peer_role_type).toInt() == PEER_TYPE_WPS_ER_AP_UNCONFIGURED)) model.removeRow(lst[i].row()); } return; } if (text.startsWith(WPS_EVENT_ER_ENROLLEE_ADD)) { /* * WPS-ER-ENROLLEE-ADD 2b7093f1-d6fb-5108-adbb-bea66bb87333 * 02:66:a0:ee:17:27 M1=1 config_methods=0x14d dev_passwd_id=0 * pri_dev_type=1-0050F204-1 * |Wireless Client|Company|cmodel|123|12345| */ QStringList items = text.split(' '); if (items.size() < 3) return; QString uuid = items[1]; QString addr = items[2]; QString pri_dev_type = items[6].mid(13); int config_methods = -1; int dev_passwd_id = -1; for (int i = 3; i < items.size(); i++) { int pos = items[i].indexOf('=') + 1; if (pos < 1) continue; QString val = items[i].mid(pos); if (items[i].startsWith("config_methods=")) { config_methods = val.toInt(0, 0); } else if (items[i].startsWith("dev_passwd_id=")) { dev_passwd_id = val.toInt(); } } int pos = text.indexOf('|'); if (pos < 0) return; items = text.mid(pos + 1).split('|'); if (items.size() < 1) return; QString name = items[0]; if (name.length() == 0) name = addr; remove_enrollee_uuid(uuid); QStandardItem *item; item = new QStandardItem(*laptop_icon, name); if (item) { item->setData(uuid, peer_role_uuid); item->setData(addr, peer_role_address); item->setData(PEER_TYPE_WPS_ER_ENROLLEE, peer_role_type); item->setToolTip(ItemType(PEER_TYPE_WPS_ER_ENROLLEE)); item->setData(items.join(QString("\n")), peer_role_details); item->setData(pri_dev_type, peer_role_pri_dev_type); if (config_methods >= 0) item->setData(config_methods, peer_role_config_methods); if (dev_passwd_id >= 0) item->setData(dev_passwd_id, peer_role_dev_passwd_id); model.appendRow(item); } return; } if (text.startsWith(WPS_EVENT_ER_ENROLLEE_REMOVE)) { /* * WPS-ER-ENROLLEE-REMOVE 2b7093f1-d6fb-5108-adbb-bea66bb87333 * 02:66:a0:ee:17:27 */ QStringList items = text.split(' '); if (items.size() < 2) return; remove_enrollee_uuid(items[1]); return; } if (text.startsWith(WPS_EVENT_ENROLLEE_SEEN)) { /* TODO: need to time out this somehow or remove on successful * WPS run, etc. */ /* * WPS-ENROLLEE-SEEN 02:00:00:00:01:00 * 572cf82f-c957-5653-9b16-b5cfb298abf1 1-0050F204-1 0x80 4 1 * [Wireless Client] * (MAC addr, UUID-E, pri dev type, config methods, * dev passwd id, request type, [dev name]) */ QStringList items = text.split(' '); if (items.size() < 7) return; QString addr = items[1]; QString uuid = items[2]; QString pri_dev_type = items[3]; int config_methods = items[4].toInt(0, 0); int dev_passwd_id = items[5].toInt(); QString name; QStandardItem *item = find_addr(addr); if (item) { int type = item->data(peer_role_type).toInt(); if (type == PEER_TYPE_ASSOCIATED_STATION) return; /* already associated */ } int pos = text.indexOf('['); if (pos >= 0) { int pos2 = text.lastIndexOf(']'); if (pos2 >= pos) { QStringList items2 = text.mid(pos + 1, pos2 - pos - 1). split('|'); name = items2[0]; } } if (name.isEmpty()) name = addr; item = find_uuid(uuid); if (item) { QVariant var = item->data(peer_role_config_methods); QVariant var2 = item->data(peer_role_dev_passwd_id); if ((var.isValid() && config_methods != var.toInt()) || (var2.isValid() && dev_passwd_id != var2.toInt())) remove_enrollee_uuid(uuid); else return; } item = new QStandardItem(*laptop_icon, name); if (item) { item->setData(uuid, peer_role_uuid); item->setData(addr, peer_role_address); item->setData(PEER_TYPE_WPS_ENROLLEE, peer_role_type); item->setToolTip(ItemType(PEER_TYPE_WPS_ENROLLEE)); item->setData(items.join(QString("\n")), peer_role_details); item->setData(pri_dev_type, peer_role_pri_dev_type); item->setData(config_methods, peer_role_config_methods); item->setData(dev_passwd_id, peer_role_dev_passwd_id); model.appendRow(item); } return; } if (text.startsWith(WPA_EVENT_BSS_ADDED)) { /* CTRL-EVENT-BSS-ADDED 34 00:11:22:33:44:55 */ QStringList items = text.split(' '); if (items.size() < 2) return; char cmd[20]; snprintf(cmd, sizeof(cmd), "BSS ID-%d", items[1].toInt()); add_bss(cmd); return; } if (text.startsWith(WPA_EVENT_BSS_REMOVED)) { /* CTRL-EVENT-BSS-REMOVED 34 00:11:22:33:44:55 */ QStringList items = text.split(' '); if (items.size() < 2) return; remove_bss(items[1].toInt()); return; } }
bool Peers::add_bss(const char *cmd) { char reply[2048]; size_t reply_len; if (hide_ap) return false; reply_len = sizeof(reply) - 1; if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) return false; reply[reply_len] = '\0'; QString bss(reply); if (bss.isEmpty() || bss.startsWith("FAIL")) return false; QString ssid, bssid, flags, wps_name, pri_dev_type; int id = -1; QStringList lines = bss.split(QRegExp("\\n")); for (QStringList::Iterator it = lines.begin(); it != lines.end(); it++) { int pos = (*it).indexOf('=') + 1; if (pos < 1) continue; if ((*it).startsWith("bssid=")) bssid = (*it).mid(pos); else if ((*it).startsWith("id=")) id = (*it).mid(pos).toInt(); else if ((*it).startsWith("flags=")) flags = (*it).mid(pos); else if ((*it).startsWith("ssid=")) ssid = (*it).mid(pos); else if ((*it).startsWith("wps_device_name=")) wps_name = (*it).mid(pos); else if ((*it).startsWith("wps_primary_device_type=")) pri_dev_type = (*it).mid(pos); } QString name = wps_name; if (name.isEmpty()) name = ssid + "\n" + bssid; QStandardItem *item = new QStandardItem(*ap_icon, name); if (item) { item->setData(bssid, peer_role_address); if (id >= 0) item->setData(id, peer_role_bss_id); int type; if (flags.contains("[WPS")) type = PEER_TYPE_AP_WPS; else type = PEER_TYPE_AP; item->setData(type, peer_role_type); for (int i = 0; i < lines.size(); i++) { if (lines[i].length() > 60) { lines[i].remove(60, lines[i].length()); lines[i] += ".."; } } item->setToolTip(ItemType(type)); item->setData(lines.join("\n"), peer_role_details); if (!pri_dev_type.isEmpty()) item->setData(pri_dev_type, peer_role_pri_dev_type); if (!ssid.isEmpty()) item->setData(ssid, peer_role_ssid); model.appendRow(item); lines = bss.split(QRegExp("\\n")); for (QStringList::Iterator it = lines.begin(); it != lines.end(); it++) { if ((*it).startsWith("p2p_group_client:")) add_p2p_group_client(item, (*it).mid(18)); } } return true; }